我正在为类制作游戏,对于这个游戏,我有一组 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))。 我认为问题在于我如何使用图形,但我无法确定具体的解决方案。 有人有什么建议吗?
最佳答案
应该调用来绘制自定义组件的唯一方法是 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();
}
}
关于java - 需要更改具有不同形状的 JButton 的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8205321/