单击一个按钮可调用JAVA Swing中另一个按钮的actionListener

时间:2016-10-11 23:14:59

标签: java swing user-interface

我刚开始学习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!");
        }
    }
}

1 个答案:

答案 0 :(得分:2)

这是因为setText最终会调用paintComponent,这会将颜色更改为随机颜色。发生这种情况是因为如果不重新绘制图形就无法更改文本,这将包括调用paintComponent,因为这是用于绘制图形的方法。

但是他的唯一发生在文本实际改变时,所以第二次点击按钮时什么都不会发生,因为你实际上并没有改变文本 - 它仍然是“好工作!”。

因此,基本上按钮不会调用另一个按钮的动作侦听器,但两个动作侦听器最终都会调用paintComponent(至少在第一次单击时,实际更改标签的文本时)。 / p>

如果要解决此问题,请将颜色随机化的部分移动到动作侦听器中,然后移出paintComponent方法。