Нужно изменить цвет JButton с другой формой - PullRequest
3 голосов
/ 21 ноября 2011

Я делаю игру для класса, и для этой игры у меня есть массив кнопок J, которые должны иметь возможность изменять цвета в зависимости от определенных факторов. У меня все получилось, и я менял цвет с помощью 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, как я показал выше, но я получаю исключение nullPointerException, когда оно достигает строки 20 (g.setColor (Color.blue)). Я думаю, что проблема в том, как я использую графику, но я не могу точно определить конкретное решение. У кого-нибудь есть предложения?

1 Ответ

3 голосов
/ 21 ноября 2011

Единственный метод, который должен вызываться для рисования вашего пользовательского компонента, это 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();
  }                        
}
...