我刚开始学习JAVA和Swing。 所以,在读完一本书后,我运行了这段代码。 它做了什么,有一个用于更改圆圈颜色的按钮和一个用于更改标签上文本的按钮。但是当我点击用于更改标签文本的按钮(第一次)时,它也会改变圆圈的颜色。第一次之后不会发生。 那么,我该怎么做才能避免这个问题,如果你能解释它为什么会发生呢? 这是代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class DrawPanel extends JPanel
{
public void paintComponent(Graphics g)
{
Graphics2D g2D = (Graphics2D) g;
int red = (int)(Math.random() * 255);
int green = (int)(Math.random() * 255);
int blue = (int)(Math.random() * 255);
Color start = new Color(red, green, blue);
red = (int)(Math.random() * 255);
green = (int)(Math.random() * 255);
blue = (int)(Math.random() * 255);
Color end = new Color(red, green, blue);
GradientPaint gradient = new GradientPaint(60, 60, start, 170, 170, end);
g2D.setPaint(gradient);
g2D.fillOval(70, 70, 100, 100);
}
}
class TwoButton
{
private DrawPanel dp;
private JFrame frame;
private JLabel label;
public static void main(String[] args)
{
TwoButton gui = new TwoButton();
gui.go();
}
private void go()
{
frame = new JFrame();
label = new JLabel("I'm a label");
dp = new DrawPanel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton colorButton = new JButton("Change color");
JButton labelButton = new JButton("Change label");
colorButton.addActionListener(new ColorListener());
labelButton.addActionListener(new LabelListener());
frame.setSize(400, 400);
frame.setVisible(true);
frame.getContentPane().add(BorderLayout.SOUTH, colorButton);
frame.getContentPane().add(BorderLayout.CENTER, dp);
frame.getContentPane().add(BorderLayout.EAST, labelButton);
frame.getContentPane().add(BorderLayout.WEST, label);
}
class ColorListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
frame.repaint();
}
}
class LabelListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
label.setText("Good Job!");
}
}
}
答案 0 :(得分:2)
这是因为setText
最终会调用paintComponent
,这会将颜色更改为随机颜色。发生这种情况是因为如果不重新绘制图形就无法更改文本,这将包括调用paintComponent
,因为这是用于绘制图形的方法。
但是他的唯一发生在文本实际改变时,所以第二次点击按钮时什么都不会发生,因为你实际上并没有改变文本 - 它仍然是“好工作!”。
因此,基本上按钮不会调用另一个按钮的动作侦听器,但两个动作侦听器最终都会调用paintComponent
(至少在第一次单击时,实际更改标签的文本时)。 / p>
如果要解决此问题,请将颜色随机化的部分移动到动作侦听器中,然后移出paintComponent
方法。