【问题标题】:Creating Triangle button In Java在Java中创建三角形按钮
【发布时间】:2013-05-31 05:37:03
【问题描述】:

我正在尝试创建一个三角形按钮。

我不知道怎么做,所以我需要帮助来创建它,请告诉我如何创建它!

这是我想要实现的目标:

有什么想法吗?

【问题讨论】:

  • 你使用的是什么 GUI 库?
  • @HovercraftFullOfEels 如果他使用 swing 会怎样
  • 我必须使用 NETbeansIDE!
  • @ManolisKaragiannis:NetBeans IDE 就是这样,一个 IDE 而不是 GUI 库。您可能正在尝试创建一个 Swing GUI,但并不清楚这个概念。在尝试创建复杂的 GUI 之前,您需要先阅读我认为的 Swing 教程。
  • 开始here

标签: java swing button geometry


【解决方案1】:

您可能只想扩展JButton 并覆盖.paint(Graphics g) 方法(扩展JComponent 在语义上是不正确的,并且可能会导致其他框架出现问题,因为这个 按钮)。 paint 是将按钮“绘制”到屏幕上的代码所在的位置。如果您添加自定义代码以按照您想要的方式绘制按钮,它将在屏幕上以不同的方式显示。您可能希望为您的按钮实现java.awt.event.MouseListener,以便当用户将鼠标悬停在按钮上或单击它时,您可以对按钮产生不同的效果。

从另一个答案中,您需要覆盖 contains(int x, int y) 以便可点击区域反映按钮的实际形状。

但这不是你想做的快速的事情,你可以从 Java 中获取现成的东西,你必须自己制作它,它非常复杂但非常可行。

【讨论】:

    【解决方案2】:

    使用 swingGUI 创建自定义 GUI 按钮更加困难。所以要简单,在 netbeans IDE 中的按钮上制作一个三角形

    public class TriangleButton extends javax.swing.JFrame {
    
    
    public TriangleButton() {
        initComponents();
    }
    
    private void initComponents() {
    
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
    
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
        jButton1.setIcon(new javax.swing.ImageIcon("triangle.png")); 
        jButton1.setText("text1");
        jButton1.setActionCommand("hii");
        jButton1.setBorder(null);
        jButton1.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton1.setMargin(new java.awt.Insets(0, 0, 0, 0));
        jButton1.setPressedIcon(new javax.swing.ImageIcon("triangle.png")); 
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
    
        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(104, 104, 104)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(90, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(52, 52, 52)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(93, Short.MAX_VALUE))
        );
    
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
    
        pack();
    }
    
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        System.out.println("Hiiiiii");
    }                                        
    
    
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TriangleButton().setVisible(true);
            }
        });
    }
    
    
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel1;
    
    
    ![http://i.stack.imgur.com/KUPWQ.jpg][1]}
    

    【讨论】:

      【解决方案3】:

      根据tothis,看起来您只需继承 JButton 并覆盖 paintBorder()contains() 方法

      我创建了这个不那么快速和肮脏的例子。我认为它会更快,但我花了大约 15 分钟才完成。

      视觉上看起来很平坦,因为我使用相同的边框并始终绘制相同的颜色,但您可能希望为鼠标悬停、单击、启用、禁用等提供不同的表示。

      如果您运行此代码,您可能会看到在您实际单击三角形内部时只执行“单击”文本:

      import java.awt.Polygon;
      import java.awt.Shape;
      import java.awt.Graphics;
      import java.awt.Graphics2D;
      import javax.swing.JFrame;
      import javax.swing.JButton;
      import javax.swing.JPanel;
      import java.awt.Dimension;
      import java.awt.event.ActionListener;
      import java.awt.event.ActionEvent;
      
      class TriangleButton extends JButton {
          private Shape triangle = createTriangle();
      
          public void paintBorder( Graphics g ) {
              ((Graphics2D)g).draw(triangle);
          }
          public void paintComponent( Graphics g ) {
              ((Graphics2D)g).fill(triangle);
          }
          public Dimension getPreferredSize() {
              return new Dimension(200,100);
          }
          public boolean contains(int x, int y) {
              return triangle.contains(x, y);
          }
      
          private Shape createTriangle() {
              Polygon p = new Polygon();
              p.addPoint( 0   , 100 );
              p.addPoint( 100 , 0   );
              p.addPoint( 200 ,100  );
              return p;
          }
      }
      
      public class A {
      
          public static void main( String ... args ) {
              JFrame frame = new JFrame();
              final JButton b =  new TriangleButton();
              b.addActionListener( new ActionListener() {
                  public void actionPerformed(ActionEvent e) {
                      System.out.println("Click!");
                  }
              });
              frame.add( new JPanel(){{add(b);}} );
              frame.setVisible(true);
      
          }
      }
      

      【讨论】:

      • 一个问题是定位文本或图标,需要 fontmetrics。
      • 是的,这不是微不足道的。您可以委托现有组件为您绘制它。可能值得一读:stackoverflow.com/a/370284/20654
      【解决方案4】:

      假设我们谈论的是 Swing,最好的办法是将 source code 替换为 JComponent,并修改 _paintImmediately 方法以绘制三角形而不是矩形。

      创建自己的 Java GUI 库可能会更容易。

      【讨论】:

      • 我该怎么做?我看到了源代码,但我正在努力理解。你的意思是我应该创建一个新类并重写我的“自己的”源代码?
      • @Manolis Karagiannis:是的,我就是这个意思。将 JComponent 复制到您的项目中,给它一个更具体的项目名称,并修改 _paintImmediately 方法。当然,您必须将从 JComponent 扩展的每个 Swing 组件的源代码复制到您的项目中,这样您就可以全部修改它们以使用您的项目特定的 JComponent。
      • 嗯..我会试试的。谢谢你的回答。嗯,这是考试的一个主题,学生只有 1 小时来传递那个按钮。我认为有一种最快的方法。我不判断您的回答,再次感谢您的关注!;)
      【解决方案5】:

      据我所知,没有标准组件可以做到这一点,您需要自己创建。

      扩展一个类似的或只是扩展一个 jpanel。

      http://www.programmersheaven.com/mb/java/247058/247058/draw-a-triangle/ 给出了一些绘制三角形的代码。

      要让它更像“按钮”,你需要一个监听器。

      【讨论】:

      • 当我看到这个时我的第一个想法是创建一个包含 10000 个单元格的大型二维表。每个单元格都是一个 JButton。这是我的第一个想法
      • 可能是BasicArrowButton,提到了here
      猜你喜欢
      • 1970-01-01
      • 2017-05-23
      • 2015-10-25
      • 2014-07-05
      • 2013-08-30
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多