Java Button动作侦听器会引发其他侦听器吗?

时间:2014-12-28 20:35:47

标签: java swing button actionlistener jlabel

我的Main类中有两个侦听器,labelButton侦听器更改JLabel中的文本,另一个colourButton更改圆形内的颜色。出于某种原因,当我点击labelButton时,它也会设置colourButton,但它只会在第一次点击时执行此操作。我只想让它改变JLabel中的文本!

public class Main {
    JFrame jframe;
    JLabel label;
    public static void main(String[] args) {
        Main main = new Main();
        main.go();
    }

    public void go() {
        jframe = new JFrame();
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton labelButton = new JButton("Change Label");
        labelButton.addActionListener(new LabelListener());

        JButton colourButton = new JButton("Change colours!");
        colourButton.addActionListener(new ColourListener());

        label = new JLabel("I'm a label");

        MyComponent component = new MyComponent();
        jframe.getContentPane().add(BorderLayout.SOUTH, colourButton);
        jframe.getContentPane().add(BorderLayout.CENTER, component);
        jframe.getContentPane().add(BorderLayout.EAST, labelButton);
        jframe.getContentPane().add(BorderLayout.WEST, label);

        jframe.setSize(400,400);
        jframe.setVisible(true);
    }

    class LabelListener implements ActionListener {
        int i = 0;
        @Override
        public void actionPerformed(ActionEvent e) {
            label.setText("Ouch! " + i++);
        }
    }

    class ColourListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            jframe.repaint();
        }
    }
}

组件

public class MyComponent extends JPanel{
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        Graphics2D g2d = (Graphics2D) g;
        int red = (int) (Math.random() * 256);
        int green = (int) (Math.random() * 256);
        int blue = (int) (Math.random() * 256);

        Color colour = new Color(red,green,blue);
        red = (int) (Math.random() * 256);
        green = (int) (Math.random() * 256);
        blue = (int) (Math.random() * 256);

        Color endColour = new Color(red,green,blue);

        GradientPaint gradient = new GradientPaint(70,70,colour,150,150,endColour);

        g2d.setPaint(gradient);
        g2d.fillOval(70, 70, 100, 100);
    }
}

2 个答案:

答案 0 :(得分:1)

这是由于标签更改的副作用。

当标签长度发生变化时,需要重新定位组件并重新进行重新绘制。它建议您不要更改paint方法中的颜色,而是在动作侦听器中更改它。

答案 1 :(得分:1)

标签的更改,因为它是透明的,将导致父容器重新绘制,以消除任何图形工件的可能性。

因为paintComponent方法将颜色随机化,这意味着无论何时重新绘制颜色,颜色都会发生变化。

这是一个很好的例子,说明了如何控制绘制过程以及绘制方法为什么只绘制组件的CURRENT状态。

将颜色随机化移至另一种方法,然后从actionListener调用该方法,该方法也会调用repaint本身