Java 遍历列表并绘制彩色正方形

Java 遍历列表并绘制彩色正方形,java,arrays,list,colors,awt,Java,Arrays,List,Colors,Awt,我有一个彩色框,我希望它每1/2秒改变一次颜色,但是我希望我的代码也能运行 我正在使用JavaAWT的图形Api使用g.fillRect(568383,48,48)进行绘制;其中g被包装为“图形” 所以你会认为这很简单,对吗 Color[] colors colors = new Color[4]; colors[0] = new Color(Color.red); colors[1] = new Color(Color.blue); colors[2] = new Color(Color.

我有一个彩色框,我希望它每1/2秒改变一次颜色,但是我希望我的代码也能运行

我正在使用JavaAWT的图形Api使用g.fillRect(568383,48,48)进行绘制;其中g被包装为“图形”

所以你会认为这很简单,对吗

Color[] colors

colors = new Color[4];

colors[0] = new Color(Color.red);
colors[1] = new Color(Color.blue);
colors[2] = new Color(Color.green);
colors[3] = new Color(Color.yellow);

for(int i = 0; i < colors.length; i++){
    g.setColor(colors[i]);
    g.fillRect(568, 383, 48, 48);
}
Color[]颜色
颜色=新颜色[4];
颜色[0]=新颜色(颜色为红色);
颜色[1]=新颜色(颜色为蓝色);
颜色[2]=新颜色(颜色为绿色);
颜色[3]=新颜色(颜色为黄色);
for(int i=0;i
这很酷,但问题是当这个for循环运行时,我的程序没有一个运行


我认为我可以使游戏“多线程”,这意味着它可以做一次以上的事情,但我不知道如何做到这一点,这听起来很难,所有帮助感谢

如果您的代码是单线程的,我无法想象您如何创建一个交互式游戏。要定期更改框颜色,您必须将线程置于睡眠状态。如果您的游戏不是多线程的,那么这将冻结您的应用程序,阻止用户交互。您将发现许多关于Java线程编程的有趣资料:


只需谷歌一下

大多数UI框架都不是线程安全的,因此您需要注意这一点。例如,在Swing中,可以使用Swing
计时器作为伪循环。由于
计时器
在事件调度线程的上下文中通知
ActionListener
,因此可以安全地从内部更新UI或UI的状态,而不会出现线程争用情况

查看和了解更多详细信息

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class JavaApplication430 {

    public static void main(String[] args) {
        new JavaApplication430();
    }

    public JavaApplication430() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Color[] colors;
        private int whichColor = 0;

        public TestPane() {

            colors = new Color[4];

            colors[0] = Color.red;
            colors[1] = Color.blue;
            colors[2] = Color.green;
            colors[3] = Color.yellow;

            Timer timer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    whichColor++;
                    repaint();
                    if (whichColor >= colors.length) {
                        whichColor = colors.length - 1;
                        ((Timer)(e.getSource())).stop();
                    }
                }
            });
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(colors[whichColor]);
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.dispose();
        }

    }

}


如果您希望同时发生1件以上的事情,则必须使其成为多线程。例如,请查看一个简单的线程示例。@NorbertvanNobelen或使用Swing计时器,这样可以更安全地从内部更新Ui,因为它不会违反Swing API的单线程特性