我正在上课,为了这个游戏,我有一系列JButton需要能够根据某些因素改变颜色。我已经解决了这个问题,并且正在使用setBackground(Color)更改颜色,但现在我正在尝试更改按钮的形状,并且仍然可以更改颜色。 我目前的代码是:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class CircleButton extends JButton {
Graphics g = this.getGraphics();
public CircleButton(){
super();
setContentAreaFilled(false);
}
protected void paintComponent(Graphics g) {
g.setColor(Color.pink);
g.fillOval(0, 0, getSize().width-1, getSize().height-1);
super.paintComponent(g);
}
public void changeColor(Color c) {
g.setColor(Color.blue);
g.fillOval(0, 0, getSize().width-1, getSize().height-1);
super.paintComponent(g);
}
}
当我改变其他代码使用它而不是JButton时,它可以工作,我从一个8x8网格的粉色圆圈开始,这就是我想要的。但现在我无法改变颜色。我已经尝试添加了如上所示的changeColor方法,但是当它到达第20行时,我得到一个nullPointerException(g.setColor(Color.blue))。 我认为问题在于我如何使用Graphics,但我无法确定具体的解决方案。 有没有人有任何建议?
答案 0 :(得分:3)
应该调用绘制自定义组件的唯一方法是paintComponent()。
在这些方法中,你总是设置粉红色,这是一个问题。
另一个问题是您正在尝试在changeColor方法中绘制组件。这是错的。让该函数仅更改指示颜色的变量。
我猜你正在寻找这样的东西:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class CircleButton extends JButton {
// Graphics g = this.getGraphics();
Color col = Color.pink;
public CircleButton(){
//commented as unuseful.. super call is implicit if constructor has no arguments
// super();
setContentAreaFilled(false);
}
protected void paintComponent(Graphics g) {
g.setColor(this.color);
g.fillOval(0, 0, getSize().width-1, getSize().height-1);
super.paintComponent(g);
}
public void changeColor(Color c) {
this.color = Color.blue; //only change the color. Let paintComponent paint
this.repaint();
}
}