2

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

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

这是我想要实现的目标:

在此处输入图像描述

有任何想法吗?

4

5 回答 5

6

根据这个,看起来你只需要继承 JButton 并覆盖 and方法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);

    }
}
于 2013-06-04T18:44:30.077 回答
4

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

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

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

于 2013-06-04T18:37:26.313 回答
3

使用 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]}
于 2013-06-04T19:34:44.983 回答
2

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

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

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

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

于 2013-06-04T17:58:11.970 回答
0

假设我们谈论的是 Swing,最好的办法是获取 的源代码JComponent并修改 _paintImmediately方法以绘制三角形而不是矩形。

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

于 2013-06-04T18:25:10.810 回答