Java 如何使JPanel中的像素动态变化?

Java 如何使JPanel中的像素动态变化?,java,jpanel,Java,Jpanel,我设计了一个程序,可以输出1x1矩形(我将从现在起调用像素),颜色在红色、绿色和蓝色之间随机变化。现在我想更进一步。首先,来源如下: public class GUI extends JPanel { private final static int MAX_X = 1920; private final static int MAX_Y = 1080; public void paintComponent(Graphics g) { super.paintComponent(g);

我设计了一个程序,可以输出1x1矩形(我将从现在起调用像素),颜色在红色、绿色和蓝色之间随机变化。现在我想更进一步。首先,来源如下:

public class GUI extends JPanel {
private final static int MAX_X = 1920;
private final static int MAX_Y = 1080;

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    for (int x = 0; x < MAX_X; x++) {
        for (int y = 0; y < MAX_Y; y++) {
  
            Color randomColor = Color.BLACK; //Black because it wouldn't work uninitialized.
            
            //Slightly inefficient? 
            int number; Random rColor = new Random();
            number = rColor.nextInt(3);
            
             if(number == 0){randomColor = Color.RED;}
             else if(number ==1){randomColor = Color.GREEN;}
             else if(number == 2){randomColor = Color.BLUE;}
            
            
            g.setColor(randomColor); //Red, Blue, or Green. Depends on if number is 0, 1 or 2.
            g.drawRect(x, y, 1, 1); 
        }
           
    
    }
    
}

}
公共类GUI扩展了JPanel{
私有最终静态int MAX_X=1920;
专用最终静态int MAX_Y=1080;
公共组件(图形g){
超级组件(g);
对于(int x=0;x
它的工作原理和我期望的一样。下一个挑战是:如何让它们不断变化?我想要的是,如果一个相邻的像素是蓝色的,那么这个像素应该是绿色的,然后任何绿色变成红色,红色变成蓝色。我不确定它目前是如何设置的,这将是可能的

旁注:我觉得有一种方法可以将我在注释中标记为“稍微低效”的几行代码最小化为更干净的代码,比如内部参数。我已经查找文档有一段时间了,但是我找不到更实用的Random


您可以使用计时器不断更改。 例如: 使用以下代码修改gui类,请参见。 此计时器每半秒运行一次,然后重新绘制jpanel。您可以将500更改为所需的毫秒。它将如下所示

您不需要每次都创建一个新的随机数。randomnumber.nextInt足够了,您可以将number作为实例

public class GUI extends JPanel {

    private final static int MAX_X = 200;
    private final static int MAX_Y = 150;
    private final Color RED = Color.RED, GREEN = Color.GREEN, BLUE = Color.BLUE;
    private final Random rColor = new Random();
    private int number;
    private Color randomColor;

    public GUI() {
        new Timer(1, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                repaint();
            }
        }).start();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        for (int x = 0; x < MAX_X; x++) {
            for (int y = 0; y < MAX_Y; y++) {

                number = rColor.nextInt(3);

                if (number == 0) { randomColor = RED;
                } else if (number == 1) { randomColor = GREEN;
                } else if (number == 2) {randomColor = BLUE;
                }

                g.setColor(randomColor);
                g.drawRect(x, y, 1, 1);
            }

        }

    }
}

公共类GUI扩展了JPanel{
私有最终静态int MAX_X=200;
专用最终静态整数最大值Y=150;
私有最终颜色红色=Color.RED,绿色=Color.GREEN,蓝色=Color.BLUE;
私有最终随机颜色=新随机();
私有整数;
私人色彩;
公共图形用户界面(){
新计时器(1,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
重新油漆();
}
}).start();
}
@凌驾
公共组件(图形g){
超级组件(g);
对于(int x=0;x
您可以延迟调用repaint。计时器请不要通过破坏您的帖子为其他人做更多的工作。通过在Stack Exchange(SE)网络上发布,您已经在a下授予SE分发内容的不可撤销权利(即,无论您未来的选择如何)。根据SE政策,分发非故意破坏版本。因此,任何故意破坏行为都将恢复原状。请参阅:。如果允许删除,在帖子下方左侧有一个“删除”按钮,但它只在浏览器中出现,不是移动应用程序。@Aarix你能澄清一下吗?我没有弄明白it@Aarix你的面板是1920*1080。所以总像素是2073600。所以这个过程很大而且有点慢。如果你使用像200*100这样的小面板,那么它的速度就足够了。无论如何,这不是你想要的吗?