Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎样才能回忆起一个长方形呢?_Java_Swing_Colors_Rectangles_Repaint - Fatal编程技术网

Java 我怎样才能回忆起一个长方形呢?

Java 我怎样才能回忆起一个长方形呢?,java,swing,colors,rectangles,repaint,Java,Swing,Colors,Rectangles,Repaint,所以基本上我有一个矩形类,我想实现一个方法,在它已经被绘制之后改变它的颜色 这是到目前为止我的代码。我认为这可能像改变一个物体的位置一样有效,但事实并非如此 public class rectangle extends JPanel(){ @Override protected void paintComponent(Graphics g){ super.paintComponent(g); g.setColor(Color.red) g.fillRect(0, 0, 30,

所以基本上我有一个矩形类,我想实现一个方法,在它已经被绘制之后改变它的颜色

这是到目前为止我的代码。我认为这可能像改变一个物体的位置一样有效,但事实并非如此

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(…)
  • 顺序(…)
  • 挫折背景(…)
  • 前景色(…) 在您的情况下,甚至不需要自定义方法。在应用程序代码中,您只需使用:

    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”以在类中保存属性
  • 自定义绘制代码以使用“颜色”属性

  • 上述3个步骤适用于要添加到类中的任何自定义属性。

    您可以执行以下操作

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