Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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 慢摆动GUI启动时间_Java_Swing_User Interface_Jframe - Fatal编程技术网

Java 慢摆动GUI启动时间

Java 慢摆动GUI启动时间,java,swing,user-interface,jframe,Java,Swing,User Interface,Jframe,我正在学习使用Java的Swing,我很早就遇到了让我的组件显示在窗口中的问题。如果我使用以下代码: import javax.swing.*; public class win extends JFrame { public static void main(String[] args) { new win(); } public win(){ this.setTitle("WIN"); this.setSize

我正在学习使用Java的Swing,我很早就遇到了让我的组件显示在窗口中的问题。如果我使用以下代码:

import javax.swing.*;

public class win extends JFrame {

    public static void main(String[] args) {

        new win();
    }

    public win(){

        this.setTitle("WIN");
        this.setSize(200,200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel l = new JLabel("Label");

        this.add(l);

        this.setVisible(true);
    }
}
除非调整窗口的大小,否则不会显示标签。我搜索了其他问题,一些人认为缺乏包装、重新验证、验证和/或重新喷漆方法是罪魁祸首。如果我将包添加到同一代码:

import javax.swing.*;

public class win extends JFrame {

    public static void main(String[] args) {

        new win();
    }

    public win(){

        this.setTitle("WIN");
        this.setSize(200,200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel l = new JLabel("Label");

        this.add(l);

        this.pack();

        this.setVisible(true);
    }
}
我的窗口显示大约需要10秒钟

更新:

按照Frakcool的建议将我的代码添加到EDT不起作用

此代码也会在10秒延迟后渲染。我不认为这是一个问题,我的电脑是缓慢的,它是一个四核32 gb内存运行高。目前我正在Java8上运行这些程序

使用EDT:

每个人都认为不使用EDT是罪魁祸首,但我尝试过,它似乎不是问题所在。除非此代码有问题,否则EDT不是解决方案:

import javax.swing.*;


public class Window extends JFrame {

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Window();
            }
        });

    }

    public Window(){

        this.setTitle("WINDOW");

        JLabel l = new JLabel("Label");

        this.add(l);

        this.pack();

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setVisible(true);
    }
}
我仍然只为这一个标签启动了10秒,其他swing组件也是如此

更新:


问题绝对不是代码中的任何东西(有或没有EDT),因为我能够在另一个OSX系统(Mojave)和Ubuntu上通过问题机器上的Virtualbox(High Sierra)毫不延迟地运行此代码。问题必须与High Sierra或我个人系统或JVM上的某些设置有关

Swing中的所有绘制操作都应在所谓的事件调度线程(EDT)上执行。将调用这些绘制操作的
java.lang.Runnable
实例及其
run()
方法传递给
SwingUtilities.invokeLater()
方法可确保此代码在EDT上执行。否则,在某个时候会出现问题,例如所谓的“灰色rect”——问题:应用程序的UI似乎滞后,甚至感觉“冻结”。看[[

我会将您的代码重构为:

import javax.swing.*;

public class Win extends JFrame {

    Win() {
        super("WIN");
        setSize(200, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String args[]) throws Exception {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new Win();
            JComponent label = new JLabel("Label");
            frame.getContentPane().add(label);
            frame.setVisible(true);
        });
    }
}

1) 您应该在EDT中运行您的代码,请参阅本文第2点。2)“打包后设置大小”为什么?您根本不应该调用
setSize(…)
,请参阅(是的,并替代
JComponent
getPreferredSize
方法,.3)您的代码中似乎没有添加额外的10秒,因此,可能您的计算机太慢了-删除该代码,再也不要查看它。它有几个问题。您的原始代码更好,如果将其放置在传递给的Runnable中,可能会起作用。提示,要通知某人您的答复,您应该添加@VGR或您正在答复的任何人(代码很重要)。而且您从未将程序放在EDT上。此外,可能是JVM上的某些配置导致了这种情况,出现在High Sierra Mac上,但没有出现在您的个人电脑上。但是,请将代码放在EDT上,不要使用
setBounds
null
布局!它与
pack
一起使用,而且不起作用。“在另一台机器上似乎工作正常”是线程问题的常见症状。您希望编写每次都能在每台机器上运行的代码。您这样做的方式是让所有Swing和AWT代码在事件调度线程中运行。更新了我的原始帖子,以显示我正在使用EDT,并且我仍然能够启动。此外,我复制粘贴了您的代码,我也遇到了同样的问题,10秒后,窗口会弹出所有渲染的内容。评论中有人建议可能是JVM设置,有什么想法吗?谢谢你花时间@Tommy Brettschneider