我有一种情况,我在GridLayout上有一堆JButton。我需要每个JButton都有:
我对背景图片没有任何问题,因为我使用的是setIcon(),但我在后台绘图时遇到问题。有一次,我能够在按钮顶部绘制,但点击按钮后,图纸消失了。如何使按钮保持此绘图状态?
基本上,我需要一种方法让我的JButton拥有公共方法,允许另一个类在其上绘制任何内容,例如:
public void drawSomething() {
Graphics g = this.getGraphics();
g.drawOval(3,2,2,2);
repaint();
}
或
public Graphics getGraphics() {
return this.getGraphics();
}
然后另一个类可以这样做:
button.getGraphics().drawSomething();
后者更符合我的要求,但第一个同样有用。
有什么方法可以解决这个问题吗?此外,覆盖父类方法paintComponent()没有帮助,因为我需要每个按钮具有不同的图形。
答案 0 :(得分:8)
你可以继承JButton并覆盖paintComponent()。 通过为子类提供外部“画家”,您可以处理具有不同图形的每个按钮。或者只为每个不同的图形使用不同的子类。
public class MyButton extends JButton {
private Painter painter;
public void paintComponent(Graphics g) {
super.paintComponent(g);
painter.paint(g);
}
}
public interface Painter {
public void paint(Graphics g);
}
你不能只是在按钮上画画,因为下次重新绘制按钮时画面会丢失。
答案 1 :(得分:3)
您可以创建BufferedImage并在其上进行自定义绘制,然后在自定义paintComponent(...)方法中绘制图像。
查看Custom Painting Approaches中的DrawOnImage示例。