如何为矩形重新着色?

问题描述

所以基本上我有一个矩形类,我想实现一个方法,在绘制矩形后更改其颜色。

到目前为止,这是我的代码。以为它可能像更改对象的位置一样起作用,但是没有。

public class rectangle extends JPanel(){

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

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

解决方法

您可以执行以下操作

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();
                }
            },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,getWidth(),getHeight());
    }

    public void recolor() {
        Random r = new Random();
        color = new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256));
        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,30,30);
}

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

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

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