Java 延迟地画形状
我知道已经有上百条线索了,但我就是不懂。。 我有一门非常简单的课,画一个网格。我想在每个方块后加上0.2秒的延迟。睡眠不起作用。最简单的方法是什么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++) {
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);
}
}