我正在尝试创建一个三角形按钮。
我不知道怎么做,所以我需要帮助创作,请向我解释如何创建它!
这就是我想要实现的目标:
有什么想法吗?
答案 0 :(得分:5)
根据to this,看起来你只需要继承JButton并覆盖paintBorder()
和contains()
方法
我创建这个不是那么快又脏的例子。我觉得它会更快但是我花了大约15分钟就来了。
视觉上看起来很平坦,因为我总是使用相同的边框并绘制相同的边框,但您可能希望为onmouse提供不同的表示,包括,点击,启用,禁用等等。
如果您运行此代码,您可能会看到在实际点击三角形内部时仅执行“Click”文本:
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);
}
}
答案 1 :(得分:4)
您可能只想扩展JButton并覆盖.paint(Graphics g)
方法(扩展JComponent
在语义上不正确,可能会导致其他框架出现问题,因为是一个按钮)。 paint
是将按钮“绘制”到屏幕上的代码。如果您添加自定义代码以按照您希望的方式绘制按钮,它将在屏幕上以不同的方式显示。您可能希望为按钮实施java.awt.event.MouseListener
,以便在用户将鼠标悬停在按钮上或点击按钮时,可以为按钮设置不同的效果。
从另一个答案中,您需要覆盖contains(int x, int y)
,以便可点击区域反映按钮的实际形状。
但这不是你想要做的快速事情,你可以抓住现成的用Java制作的东西,你必须亲自制作它并且它非常复杂但非常可行。
答案 2 :(得分: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]}
答案 3 :(得分:2)
我知道没有标准组件可以做到这一点,你需要创建自己的组件。
扩展一个类似的或只是扩展一个jpanel。
http://www.programmersheaven.com/mb/java/247058/247058/draw-a-triangle/提供了绘制三角形的代码。
要使它更像“按钮”,就像你需要一个听众。
答案 4 :(得分:0)
假设我们正在讨论Swing,最好的办法是将source code用于JComponent
,并修改_ paintImmediately
方法以绘制三角形而不是矩形。
创建自己的Java GUI库可能会更容易。