我正在学习一些基本的Java,使用内部类来创建两个按钮的gui。一个按钮更改绘制的圆的颜色,另一个按钮更改标签的文本。我遇到的问题是,当我单击“更改标签”按钮时,圆圈的颜色也会发生变化(第一次单击时,此后不会发生任何变化)。如果我单击“更改颜色”按钮,它会按预期操作,每次单击时只更改圆的颜色。基本上,我想试着理解为什么会发生这种情况。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TwoButtons {
JFrame frame;
JLabel label;
public static void main (String[] args) {
TwoButtons gui = new TwoButtons ();
gui.go();
}
public void go () {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton labelButton = new JButton("Change Label");
labelButton.addActionListener(new LabelListener());
JButton colorButton = new JButton("Change Colour");
colorButton.addActionListener(new ColorListener());
label = new JLabel("I'm a label");
MyDrawPanel drawPanel = new MyDrawPanel();
class MyDrawPanel extends JPanel {
public void paintComponent(Graphics g) {
g.fillRect(0,0,this.getWidth(), this.getHeight());
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color randomColor = new Color(red, green, blue);
g.setColor(randomColor);
g.fillOval(140,140,300,300);
}
}
frame.getContentPane().add(BorderLayout.SOUTH, colorButton);
frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
frame.getContentPane().add(BorderLayout.EAST, labelButton);
frame.getContentPane().add(BorderLayout.WEST, label);
frame.setSize(600, 600);
frame.setVisible(true);
}
class LabelListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
label.setText("Boom!");
}
}
class ColorListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
frame.repaint();
}
}
}发布于 2015-07-24 23:34:44
我猜每当JFrame的组件发生变化时,框架都会自动重绘。因为在第一次单击label按钮后文本不再更改,所以在单击label按钮后不会自动调用repaint。
发布于 2015-07-28 17:31:11
在你的paintComponent方法中,你每次都会得到颜色分量的新值。问题是,这个方法可以由于很多原因而被调用,而不仅仅是当您调用repaint时。
我建议您在TwoButtons类中获取字段Color randomColor并移动代码
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
randomColor = new Color(red, green, blue);在ColorListener中的frame.repaint();之前
https://stackoverflow.com/questions/31614381
复制相似问题