据到 这个,它看起来像你只需要继承JButton,并覆盖paintBorder()
和contains()
方法
我创建这个不是那么快又脏的例子.我觉得它会更快但是我花了大约15分钟就来了.
视觉上看起来很平坦,因为我总是使用相同的边框并且绘制相同的边框,但是您可能希望为onmouse提供不同的表示,包括,单击,启用,禁用等.
如果您运行此代码,您可能会看到在实际单击三角形内部时仅执行"单击"文本:
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);
}
}
Run Code Online (Sandbox Code Playgroud)