Java 为什么时间单位。秒。睡眠(10);在前面的代码之前被调用?
上面是我想要10秒延迟的类(只是测试)。 下面是生成JFrame GUI的类,我在其中运行上述代码Java 为什么时间单位。秒。睡眠(10);在前面的代码之前被调用?,java,user-interface,jframe,wait,Java,User Interface,Jframe,Wait,上面是我想要10秒延迟的类(只是测试)。 下面是生成JFrame GUI的类,我在其中运行上述代码 package me.tykutcher.text.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.util.concurrent.TimeUnit; import javax.swing.JPanel; public class TestPane
package me.tykutcher.text.gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.concurrent.TimeUnit;
import javax.swing.JPanel;
public class TestPane extends JPanel {
public boolean sleeper = false;
public boolean sleeper2 = false;
public boolean sleeper3 = false;
public boolean sleeper4 = false;
public boolean sleeper5 = false;
public boolean sleeper6 = false;
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Loading", 10, 23);
g.drawRect(60, 13, 175, 10);
g.setColor(Color.GREEN);
g.fillRect(61, 14, 25, 9);
sleeper = true;
if(sleeper == true){ //why do all of the delays run before adding the string, adding the rectangle, and filling the rectangle
try {
//delay for 10 seconds
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}
sleeper = false;
g.fillRect(87, 14, 25, 9);
sleeper2 = true;
if(sleeper2 == true){
try {
//delay for 10 seconds
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
sleeper2 = false;
}
public Dimension getPreferredSize() {
return new Dimension(250, 37);
}
}
导入javax.swing.JFrame
公共类textGui{
package me.tykutcher.text.gui;
如果我注释掉wait命令,代码将立即运行,最终,我将使用notify或boolean方法来完成此操作,因为我的gui实际上将在睡眠前绘制图形,但只有在睡眠后,当
paintComponent
方法完成时,您才会看到它们
如果您想绘制一些形状,然后进行时间传递,然后再绘制一些,您需要在
paintComponent
方法之外进行时间传递(可能使用javax.swing.Timer
)并决定每次调用paintComponent
时要绘制什么。您在睡眠前绘制了形状,但只有在paintComponent
方法完成后,即睡眠后,才能看到它们
如果您想绘制一些形状,然后进行时间传递,然后再绘制一些,您需要在
paintComponent
方法之外进行时间传递(可能使用javax.swing.Timer
)并决定每次调用paintComponent
时绘制什么。thread.sleep在这里不起作用,因为它阻止Swing执行其必要的功能。因此,Swing在两个睡眠计时器都用完之前无法完成paintComponent并输出加载条。正如Jonathan所述,最简单的解决方案是使用Javax.swing.Timer并在GUI需要更新时调用repaint()
我使用计时器功能修复了加载栏:
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setTitle("Loading... ");
frame.add(new TestPane());
frame.pack();
frame.setVisible(true);
}
}
thread.sleep在这里不起作用,因为它阻止Swing执行其必要的功能。因此,Swing无法完成paintComponent并输出加载条,直到两个睡眠计时器都用完。正如Jonathan前面提到的,最简单的解决方案是使用Javax.Swing.Timer并调用repaint()任何需要更新GUI的时候 我使用计时器功能修复了加载栏:
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setTitle("Loading... ");
frame.add(new TestPane());
frame.pack();
frame.setVisible(true);
}
}
它没有。你不应该在att用这种方法睡觉。它没有。你不应该在att用这种方法睡觉。