我在一个JFrame中有3个JPanel。其中两个是用于放置JButton,另一个是用来画图的画布。
我为每个JButton生成了一个随机颜色,在JPanel的中心绘制一个椭圆,并在每次单击JButton时更改椭圆的颜色。
问题在于颜色没有改变。
CirclePanel.java:
CirclePanel.java:
public class CirclePanel extends JPanel
{
private static final long serialVersionUID = 1L;
private Color color;
public Color getColor()
{
return this.color;
}
public void setColor(Color color)
{
this.color = color;
repaint();
}
public CirclePanel()
{
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
final int OVAL_WIDTH = this.getWidth() / 2;
final int OVAL_HEIGHT = this.getHeight() / 2;
final int xPosition = OVAL_WIDTH / 2;
final int yPosition = OVAL_HEIGHT / 2;
g.setColor(this.color);
g.fillOval(xPosition,yPosition,OVAL_WIDTH,OVAL_WIDTH);
}
}
RightPanel.java 和 LeftPanel.java:
public class RightPanel extends JPanel implements ActionListener
{
private static final long serialVersionUID = 1L;
private static final int BUTTONS = 6;
private CirclePanel circlePanel;
public RightPanel(CirclePanel circlePanel)
{
this.circlePanel = circlePanel;
this.setLayout(new GridLayout(BUTTONS,0));
// Adding buttons to the layout
for (int i = 0;i < RightPanel.BUTTONS;i++)
{
JButton button = new JButton();
button.setBackground(generateColor());
button.addActionListener(this);
this.add(button);
}
this.setVisible(true);
}
public Color generateColor()
{
Random random = new Random();
// 255 - maximum value. 0 - minimum value
int randomNumber1 = random.nextInt((255 - 0) + 1) + 0;
int randomNumber2 = random.nextInt((255 - 0) + 1) + 0;
int randomNumber3 = random.nextInt((255 - 0) + 1) + 0;
Color color = new Color(randomNumber1,randomNumber2,randomNumber3);
return color;
}
@Override
public void actionPerformed(ActionEvent e)
{
Color color = ((JButton)e.getSource()).getBackground();
this.circlePanel.setColor(color);
}
}
public class LeftPanel extends JPanel implements ActionListener
{
private static final long serialVersionUID = 1L;
private static final int BUTTONS = 6;
private CirclePanel circlePanel;
public LeftPanel(CirclePanel circlePanel)
{
this.circlePanel = circlePanel;
this.setLayout(new GridLayout(BUTTONS,0));
// Adding buttons to the layout
for (int i = 0;i < LeftPanel.BUTTONS;i++)
{
JButton button = new JButton();
button.setBackground(generateColor());
button.addActionListener(this);
this.add(button);
}
this.setVisible(true);
}
public Color generateColor()
{
Random random = new Random();
// 255 - maximum value. 0 - minimum value
int randomNumber1 = random.nextInt((255 - 0) + 1) + 0;
int randomNumber2 = random.nextInt((255 - 0) + 1) + 0;
int randomNumber3 = random.nextInt((255 - 0) + 1) + 0;
Color color = new Color(randomNumber1,randomNumber2,randomNumber3);
return color;
}
@Override
public void actionPerformed(ActionEvent e)
{
Color color = ((JButton)e.getSource()).getBackground();
this.circlePanel.setColor(color);
}
}
MyFrame.java:
public class MyFrame extends JFrame
{
private static final long serialVersionUID = 1L;
private CirclePanel circlePanel;
public MyFrame()
{
super("paintComponent");
this.circlePanel = new CirclePanel();
this.setLayout(new BorderLayout());
this.setSize(400,400);
this.setResizable(false);
this.add(new LeftPanel(this.circlePanel),BorderLayout.WEST);
this.add(new RightPanel(this.circlePanel),BorderLayout.EAST);
this.add(new CirclePanel(),BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args)
{
new MyFrame();
}
}
我检查了一下程序,发现它确实到达了每个actionPerformed()
方法。
那么问题出在哪里呢?
this.circlePanel.revalidate()
来使更改生效。 - Pragnani