Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么时间单位。秒。睡眠(10);在前面的代码之前被调用?_Java_User Interface_Jframe_Wait - Fatal编程技术网

Java 为什么时间单位。秒。睡眠(10);在前面的代码之前被调用?

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

上面是我想要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 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用这种方法睡觉。