需要更改具有不同形状的JButton的颜色

时间:2011-11-20 22:36:46

标签: java swing colors jbutton shape

我正在上课,为了这个游戏,我有一系列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,但我无法确定具体的解决方案。 有没有人有任何建议?

1 个答案:

答案 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();
  }                        
}