Java 延迟地画形状

Java 延迟地画形状,java,swing,Java,Swing,我知道已经有上百条线索了,但我就是不懂。。 我有一门非常简单的课,画一个网格。我想在每个方块后加上0.2秒的延迟。睡眠不起作用。最简单的方法是什么 public Screen() { repaint(); } public void paint(Graphics g) { for(int i = 0; i < 9; i++) { for(int j = 0; j < 9; j++) {

我知道已经有上百条线索了,但我就是不懂。。 我有一门非常简单的课,画一个网格。我想在每个方块后加上0.2秒的延迟。睡眠不起作用。最简单的方法是什么

    public Screen() {
        repaint();
    }
    public void paint(Graphics g) {

        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                g.drawRect(50 * i, 50 * j, 50, 50);
                //Add delay
            }
        }
    }
公共屏幕(){
重新油漆();
}
公共空间涂料(图g){
对于(int i=0;i<9;i++){
对于(int j=0;j<9;j++){
g、 drawRect(50*i,50*j,50,50);
//增加延迟
}
}
}

实现延迟绘图的最简单方法是使用,这是一个在执行时不会阻塞的类。这将允许您在不阻塞UI的情况下创建延迟(并使所有内容同时显示)

您将有一个
JPanel
来处理
paintComponent(…)
方法中的绘制,而不是像您在上面的代码中那样处理
paint(…)
。此
JPanel
将重新绘制API中的每个
矩形

导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
公共类延迟绘制{
私有JFrame;
私人JPanel窗格;
私人定时器;
私有int xCoord=0;
private int yCoord=0;
专用静态最终内部间隙=10;
专用静态最终整型宽度\高度=10;
私有静态最终整数行=5;
专用静态最终int COLS=5;
私有列表矩形;
@抑制警告(“串行”)
私有void createAndShowGUI(){
//我们创建JFrame
frame=newjframe(this.getClass().getSimpleName());
//我们从shapeapi创建一个矩形列表
矩形=新的ArrayList();
create矩形();
//创建要绘制每个矩形的JPanel
pane=newjpanel(){
//指定JPanel的大小
@凌驾
公共维度getPreferredSize(){
返回新尺寸(150、150);
}
//这就是“魔法”发生的地方,它在我们的列表上迭代并重新绘制其中的每个矩形
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
用于(矩形r:矩形){
System.out.println(r.x+“”+r.y);
g2d.绘图(r);
}
}
};
//这启动了我们的计时器
定时器=新定时器(200,侦听器);
定时器。设置初始延迟(1000);
timer.start();
//我们把一切都添加到框架中
框架。添加(窗格);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//创建一个新矩形并将其添加到列表中
私有void createRectangle(){
矩形r=新矩形(xCoord*宽度+高度+间隙,yCoord*宽度+高度+间隙,宽度+高度,宽度+高度);
矩形。加(r);
}
//这将在每次启动计时器时执行
私有ActionListener=e->{
if(xCoord<行){
if(yCoord

我知道已经有数百个线程,但我无法理解-向我们展示一个您不理解的线程,并就该线程中给出的代码提出一个具体问题。为什么你认为我们的解释会与你已经看到的有所不同?我们猜不出你对其他线程有什么困惑。
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class DelayedDrawing {
    private JFrame frame;
    private JPanel pane;
    private Timer timer;
    private int xCoord = 0;
    private int yCoord = 0;
    private static final int GAP = 10;
    private static final int WIDTH_HEIGHT = 10;
    private static final int ROWS = 5;
    private static final int COLS = 5;

    private List<Rectangle> rectangles;

    @SuppressWarnings("serial")
    private void createAndShowGUI() {
        //We create the JFrame
        frame = new JFrame(this.getClass().getSimpleName());
        //We create a list of Rectangles from the Shape API
        rectangles = new ArrayList<>();
        createRectangle();

        //Creates our JPanel that's going to draw every rectangle
        pane = new JPanel() {
            //Specifies the size of our JPanel
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(150, 150);
            }

            //This is where the "magic" happens, it iterates over our list and repaints every single Rectangle in it
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                for (Rectangle r : rectangles) {
                    System.out.println(r.x + " " + r.y);
                    g2d.draw(r);
                }
            }
        };

        //This starts our Timer
        timer = new Timer(200, listener);
        timer.setInitialDelay(1000);
        timer.start();

        //We add everything to the frame
        frame.add(pane);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    //Creates a new Rectangle and adds it to the List
    private void createRectangle() {
        Rectangle r = new Rectangle(xCoord * WIDTH_HEIGHT + GAP, yCoord * WIDTH_HEIGHT + GAP, WIDTH_HEIGHT, WIDTH_HEIGHT);
        rectangles.add(r);
    }

    //This will be executed everytime the Timer is fired
    private ActionListener listener = e -> {
        if (xCoord < ROWS) {
            if (yCoord < COLS) {
                yCoord++;
            } else {
                yCoord = 0;
                xCoord++;
                if (xCoord == ROWS) {
                    timer.stop();
                    return;
                }
            }
        }
        createRectangle();
        pane.repaint();
    };

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new DelayedDrawing()::createAndShowGUI);
    }
}