0

下面代码中的按钮对我来说是唯一应该监听 ActionEvents 的对象,但是当我调整窗口大小时,圆圈会改变颜色,这只会在按下按钮时发生。

在调整为 drawPanel 对象生成新值的窗口大小时,它是否以某种方式使用 frame.repaint(),或者甚至在每次屏幕显示时使用新的随机值创建一个新的 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 方法在容器被重新验证时调用(在调整大小时发生)。每当 Swing 出于某种原因需要重绘组件时,都会调用 repaint 方法。你不应该依赖它不被调用。

于 2009-07-07T20:04:53.753 回答