0

以下のコードのボタンは、ActionEvents をリッスンする必要がある唯一のオブジェクトですが、ウィンドウのサイズを変更すると、ボタンが押されたときにのみ発生するはずの円の色が変わります。

ウィンドウのサイズを変更するときに何らかの方法で frame.repaint() を使用して、 drawPanel オブジェクトの新しい値を生成するか、画面が新しいランダム値で表示されるたびに新しい drawPanel オブジェクトを作成しますか?

テスト.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test implements ActionListener {

    JFrame frame;
    JButton button;

    public static void main (String[] args) {
            Test gui = new Test();
            gui.go();
    }

    public void go() {
        frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        button = new JButton("Pressme!");
        button.addActionListener(this);

        MyPanelDraw drawPanel = new MyPanelDraw();

        frame.getContentPane().add(BorderLayout.SOUTH, button);
        frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
        frame.setSize(300,300);
        frame.setVisible(true);
    }

    public void actionPerformed (ActionEvent event) {

        button.setText("Changed");
        frame.repaint();

    }

}

MyPanelDraw.java

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

class MyPanelDraw 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 startColor = new Color(red, green, blue);

        red = (int) (Math.random() * 255);
        green = (int) (Math.random() * 255);
        blue = (int) (Math.random() * 255);

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

        GradientPaint gradient = new GradientPaint(70,70,startColor, 150,150, endColor);
        g2d.setPaint(gradient);
        g2d.fillOval(40,70,100,100);

    }
}
4

1 に答える 1

2

repaint メソッドは、コンテナーが再検証されたときに呼び出されます (これは、コンテナーのサイズが変更されたときに発生します)。repaint メソッドは、何らかの理由で Swing がコンポーネントを再描画する必要があるときに呼び出されます。呼び出されないことに依存するべきではありません。

于 2009-07-07T20:04:53.753 に答える