0

这个应用程序有两个按钮。一种是单击时随机更改颜色,另一种是更改应用程序中的标签。

问题是虽然我已经编写了单独的ActionListener类并分别用对应方法注册了它们。

每次我单击“更改标签”按钮时,颜色也会发生变化。这里发生了什么?

package my;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.ArrayList;

    import javax.swing.*;

    public class SimpleGui3C {

        JFrame frame;
        JLabel label;

        public static void main(String[] args){
            SimpleGui3C gui = new SimpleGui3C();
            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 Circle");
            colorButton.addActionListener(new ColorListener());

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

            MyDrawPanel drawPanel = new MyDrawPanel();

            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(300,300);
            frame.setVisible(true);


        }

        class LabelListener implements ActionListener{
            public void actionPerformed(ActionEvent event1) {
                ArrayList<String> labelContent = new ArrayList<String>();
                labelContent.add("Ouch!");
                labelContent.add("Damn!");
                labelContent.add("Holy shit!");
                labelContent.add("WTF?!");
                labelContent.add("Stop it!");
                labelContent.trimToSize();

                int i = (int)(Math.random()*5);
                String a = (String)labelContent.get(i);
                label.setText(a);
            }
        }

        class ColorListener implements ActionListener{
            public void actionPerformed(ActionEvent event2) {
                frame.repaint();
            }
        }
    }

            package my;
            import java.awt.*;
            import javax.swing.*;

            public class MyDrawPanel extends JPanel{
                /**
                 * 
                 */
                private static final long serialVersionUID = 1L;

                public void paintComponent(Graphics g){
                    Graphics2D g2d = (Graphics2D) g;

                    int red = (int)(Math.random()*255);
                    int blue = (int)(Math.random()*255);
                    int green = (int)(Math.random()*255);
                    Color startColor = new Color(red,blue,green);

                    red = (int)(Math.random()*255);
                    blue = (int)(Math.random()*255);
                    green = (int)(Math.random()*255);
                    Color endColor = new Color(red,blue,green);

                    int startPositionX = (int)(Math.random()*70);
                    int startPositionY = (int)(Math.random()*70);

                    int endPositionX = (int)(Math.random()*150);
                    int endPositionY = (int)(Math.random()*150);

                    GradientPaint gradient = new GradientPaint(startPositionX,startPositionY,startColor,endPositionX,endPositionY,endColor);
                    g2d.setPaint(gradient);
                    g2d.fillOval(20,60,100,100);

                }
            }
4

2 回答 2

2

最有可能的是,当您更改标签时,会调用 repaint() 并调用 MyDrawPanel.paintComponent() 并使用随机颜色重新绘制框架。
更好的实现可以是:

class SimpleGui3C {
  Color startColor;
  Color endColor;

  ColorListener() {
    startColor = <code to generate a random color>;
    endColor = <code to generate a random color>;
    repaint();
  }
}

并由 监听器MyDrawPanel.paintComponent()使用startColor和生成;endColor记得初始化颜色变量以避免 NPE!

于 2013-08-19T17:27:41.100 回答
0

每次单击labelButton它都会触发MyDrawPanel.

这会导致颜色再次随机生成,从而改变 的颜色MyDrawPanel

我建议通过从 MyDrawPanel 上的 ColorListener 调用改变其颜色的方法来解决此问题。这将防止面板在每次重绘时改变颜色。

这正是如何做到这一点:

class ColorListener implements ActionListener{
    MyDrawPanel colorPanel;
    public ColorListener(MyDrawPanel panel){
        this.colorPanel = panel;
    }

    public void actionPerformed(ActionEvent event2) {
        colorPanel.generateRandomColor();
        frame.repaint();
    }
}

public class MyDrawPanel extends JPanel{
    GradientPaint gradient;
    public MyDrawPanel(){ 
        generateRandomColor();
    }
    public void generateRandomColor(){
        int red = (int)(Math.random()*255);
        int blue = (int)(Math.random()*255);
        int green = (int)(Math.random()*255);
        Color startColor = new Color(red,blue,green);

        red = (int)(Math.random()*255);
        blue = (int)(Math.random()*255);
        green = (int)(Math.random()*255);
        Color endColor = new Color(red,blue,green);

        int startPositionX = (int)(Math.random()*70);
        int startPositionY = (int)(Math.random()*70);

        int endPositionX = (int)(Math.random()*150);
        int endPositionY = (int)(Math.random()*150);

        gradient = new GradientPaint(startPositionX,startPositionY,
            startColor, endPositionX,endPositionY,endColor);
     }
 }
于 2013-08-19T17:27:00.060 回答