0

このアプリには 2 つのボタンがあります。1 つはクリックしたときにランダムに色を変更するためのもので、もう 1 つはアプリ内のラベルを変更するためのものです。

問題は、別の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()ますstartColorendColorNPE を避けるために、カラー変数を初期化することを忘れないでください!

于 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 に答える