gpt4 book ai didi

java - 自定义 JButton PaintComponent 方法以视觉方式修改形状?不是实际的按钮形状?

转载 作者:行者123 更新时间:2023-12-02 07:59:07 25 4
gpt4 key购买 nike

我正在尝试创建一个包含 map 的应用程序(Java)。每个县或州都需要有自己的 mouseover、mouseClicked 方法等。

我尝试执行此操作的方法是重写扩展 JButton 的自定义类中的paintComponent 和paintBorder 方法。代码和结果截图:

public class CustomButton extends JButton implements MouseListener {


private Polygon shape;
private boolean isMouseOver;
private Color buttonColor = new Color(100,100,100);


public CustomButton (Polygon shape,Color buttonColor) {
//this.setText(text);
this.buttonColor = buttonColor;
this.shape = shape;
setContentAreaFilled(false);
addMouseListener(this);
}


@Override
public Dimension getPreferredSize() {
return (new Dimension(120, 120));
}

// Hit detection
public boolean contains(int x, int y) {
return shape.contains(x, y);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);


if (isMouseOver && isEnabled()) {
g.setColor(new Color(buttonColor.getRed()+50,buttonColor.getGreen()+50,buttonColor.getBlue()+50));
}else{
g.setColor(buttonColor);
}
g.fillPolygon(shape);


}

protected void paintBorder(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.setStroke(new BasicStroke(2));

if (isMouseOver && isEnabled()) {
g2d.setColor(new Color(buttonColor.getRed()-50,buttonColor.getGreen()-50,buttonColor.getBlue()-50));
}else{
g2d.setColor(new Color(buttonColor.getRed()-100,buttonColor.getGreen()-100,buttonColor.getBlue()-100));
}
g2d.drawPolygon(shape);

}

结果:

http://s9.postimg.org/cr8t6uym7/ss1.png

我想要实现的目标(在 Paint 中编辑):

http://s23.postimg.org/aabdtin6z/ss2.png

我认为这是因为即使我重写了paintComponent方法。这只修改 JButton 内部绘制的内容?所以 JButton 的边界仍然是矩形?有没有办法来解决这个问题?或者我应该努力实现这个目标以完全不同的方式?

任何帮助都会很棒!我什至看过在 OpenGL 中进行编程..我对此非常有兴趣经验少用!而且它需要永远!

非常感谢

蒂姆

最佳答案

您可以借助 null LayoutManager 来实现这一点:

  1. 删除 getPreferredSize() 方法。
  2. 将空布局设置为按钮容器 (setLayout(null);)。
  3. 为按钮设置相同的边界,如下所示:

    b1.setBounds(0,0,80,80);
    b2.setBounds(0,0,80,80);

enter image description here

此外,为了实现按钮单击,您需要使用 ActionListener 而不是 MouseListener

关于java - 自定义 JButton PaintComponent 方法以视觉方式修改形状?不是实际的按钮形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21113706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com