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

标签 java swing colors jbutton shapes

我正在为类制作游戏,对于这个游戏,我有一组 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/

相关文章:

java - 删除使用复杂布局的容器

javascript - 获取半透明黑色 div 的结果背景颜色?

java - Jquery $.post 问题

java - 在 Android Studio 3.4 中将字符串值从一个 Activity 发送到另一个 Activity 时,如何获取所有值

java - 调用返回 null 的 getGraphics() 的任何替代方法

java - 获取排序的 TableModel

c++ - Ncurses C++ 打印前景色/背景色交换的文本

python - tkinter:按钮颜色不更新

java - JnetPcap:从脱机文件读取速度非常慢

java - 查找集合字段包含任何给定项目的所有条目