用Java创建三角形按钮

用Java创建三角形按钮,java,swing,button,geometry,Java,Swing,Button,Geometry,我正在尝试创建一个三角形按钮 我不知道怎么做,所以我需要帮助创建,请向我解释如何创建它 以下是我努力实现的目标: 有什么想法吗?据我所知,没有标准组件可以实现这一点,您需要创建自己的组件 扩展一个类似的或只是扩展一个jpanel 给出了一些绘制三角形的代码 要使它更像“按钮”,你需要一个监听器 假设我们讨论的是Swing,最好的方法是使用forJComponent,并修改paintimmediate方法以绘制三角形而不是矩形 创建自己的Java GUI库可能更容易。您可能只想扩展并覆盖该方法(

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

我不知道怎么做,所以我需要帮助创建,请向我解释如何创建它

以下是我努力实现的目标:


有什么想法吗?

据我所知,没有标准组件可以实现这一点,您需要创建自己的组件

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

给出了一些绘制三角形的代码


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

假设我们讨论的是Swing,最好的方法是使用for
JComponent
,并修改paintimmediate方法以绘制三角形而不是矩形


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

您可能只想扩展并覆盖该方法(扩展
JComponent
在语义上不正确,可能会给其他框架带来麻烦,因为这是一个按钮)<代码>绘制是将按钮“绘制”到屏幕上的代码所在。如果您添加自定义代码以按所需方式绘制按钮,则按钮在屏幕上的显示方式将有所不同。您可能希望为按钮实现不同的效果,这样当用户将鼠标悬停在按钮上或单击按钮时,您就可以对按钮产生不同的效果

从另一个答案中,您需要覆盖,以便可单击区域反映按钮的实际形状

但是这不是一件很快就能完成的事情,你可以直接从Java中获取一些现成的东西,你必须自己制作,它非常复杂,但是非常可行。

根据,看起来你只需要将JButton子类化,并覆盖
paintBorder()
contains()
方法

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

视觉上看起来很平坦,因为我使用相同的边框并始终绘制相同的边框,但您可能希望为onmouse over、click、enable、disable等提供不同的表示

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

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);

    }
}

使用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]}

你在用什么GUI库?@HovercraftFullOfEels如果他用swingI怎么办?你必须用NETbeansIDE@ManolisKaragiannis:NetBeans IDE就是这样,一个IDE而不是GUI库。可能您正在尝试创建一个Swing GUI,但不清楚这个概念。在尝试创建复杂的GUI之前,您需要先阅读Swing教程。开始。我看到这一点时的第一个想法是创建一个包含10000个单元格的大型二维表格。每个单元格都是一个JButton。这是我的第一个想法可能是
BasicArrowButton
,我提到了。我该怎么做?我看到了源代码,但我正在努力理解。你的意思是我应该创建一个新类并重写我“自己的”源代码吗?@Manolis Karagiannis:是的,这就是我的意思。将JComponent复制到您的项目中,给它一个更特定于项目的名称,并修改PaintInstance方法。当然,您必须将从JComponent扩展的每个Swing组件的源代码复制到您的项目中,这样你就可以修改它们来使用你的项目特定的JComponent。嗯……我会试试的。谢谢你的回答。这是考试的一个主题,学生们只有一个小时的时间来传递这个按钮。我认为有一个最快的方法。我不需要你的答案,再次感谢你的兴趣!;)谢谢你的回答!一个问题是定位文本或图标,需要fontmetrics。是的,这不是小事。您可以委托现有零部件为您绘制。也许值得一读: