如何重新着色矩形?

How can I recolor a rectangle?

所以基本上我有一个 class 的矩形,我想实现一种在绘制完成后改变颜色的方法。

到目前为止,这是我的代码。认为它可能像改变物体的位置一样工作,但它没有。

public class rectangle extends JPanel(){

@Override
protected void paintComponent(Graphics g){
   super.paintComponent(g);
   g.setColor(Color.red)
   g.fillRect(0, 0, 30, 30);
}

public void recolor(){
  Color.blue;
  repaint();
}
}

不要保留硬编码值。当您使用 Swing 组件时,它们具有允许您动态更改 属性.

的方法

例如,所有组件都有如下方法:

  1. setFont(...)
  2. setBorder(...);
  3. setBackground(...);
  4. setForeground(...);

在您的情况下,您甚至不需要自定义方法。在您的应用程序代码中,您可以只使用:

someComponent.setForeground( Color.BLUE );

然后在你的绘画代码中使用:

@Override
protected void paintComponent(Graphics g)
{
   super.paintComponent(g);
   //g.setColor(Color.red)
   g.setColor( getForeground() ); 
   g.fillRect(0, 0, 30, 30);
}

如果您不想使用前景色 属性,那么您可以在您的代码中添加自定义 属性。基本步骤是

  1. 创建类似 setColor(Color color) 的方法
  2. 创建实例变量“color”以将 属性 保存在 class
  3. 自定义绘画代码以使用“颜色”属性

以上 3 个步骤适用于任何要添加到 class 的自定义 属性。

您可以执行以下操作

Main.java

import java.awt.Dimension;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main {

public static void main(String[] args) throws InterruptedException {
    SwingUtilities.invokeLater(new Runnable() { //do some research about SwingUtilities.invokeLater
        @Override
        public void run() {
            JFrame frame = new JFrame();
            JPanel panel = (JPanel) frame.getContentPane();
            Rectangle rectangle = new Rectangle();
            panel.add(rectangle);

            frame.setPreferredSize(new Dimension(400, 400));
            frame.pack();
            frame.setVisible(true);

            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    rectangle.recolor();
                }
            }, 0, 1000); // 0 = initial delay, 1000 = intervall
        }
    });

}

}

Rectangle.java

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JPanel;

public class Rectangle extends JPanel {

    private Color color;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(color);
        g.fillRect(0, 0, getWidth(), getHeight());
    }

    public void recolor() {
        Random r = new Random();
        color = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
        repaint();
    }
}