如何重新着色矩形?
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 组件时,它们具有允许您动态更改 属性.
的方法
例如,所有组件都有如下方法:
- setFont(...)
- setBorder(...);
- setBackground(...);
- 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);
}
如果您不想使用前景色 属性,那么您可以在您的代码中添加自定义 属性。基本步骤是
- 创建类似 setColor(Color color) 的方法
- 创建实例变量“color”以将 属性 保存在 class
中
- 自定义绘画代码以使用“颜色”属性
以上 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();
}
}
所以基本上我有一个 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 组件时,它们具有允许您动态更改 属性.
的方法例如,所有组件都有如下方法:
- setFont(...)
- setBorder(...);
- setBackground(...);
- 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);
}
如果您不想使用前景色 属性,那么您可以在您的代码中添加自定义 属性。基本步骤是
- 创建类似 setColor(Color color) 的方法
- 创建实例变量“color”以将 属性 保存在 class 中
- 自定义绘画代码以使用“颜色”属性
以上 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();
}
}