gpt4 book ai didi

java - 慢速 Swing GUI 启动时间

转载 作者:行者123 更新时间:2023-12-01 23:58:38 25 4
gpt4 key购买 nike

我正在使用 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);
}
}

除非调整窗口大小,否则我的标签将不会显示。我搜索了其他问题,有些人认为缺少 pack、revalidate、validate 和/或 repaint 方法是罪魁祸首。如果我将包添加到相同的代码中:

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 秒延迟后呈现。我不认为这是我的电脑速度慢的问题,它是一台运行 High Sierra 的四核 32 GB RAM 机器。目前我在 Java 8 上运行这些程序。

使用 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);
}
}

我仍然只为这个 Label 启动 10 秒,这与其他 swing 组件相同。

更新:

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

最佳答案

Swing 中的所有绘制操作都应在所谓的事件调度线程 (EDT) 上执行。将 java.lang.Runnable 实例(及其调用这些绘画操作的 run() 方法)传递给 SwingUtilities.invokeLater() 方法可确保该代码在 EDT 上执行。否则,在某些时候会出现问题,例如所谓的“灰色矩形”问题:应用程序的 UI 似乎滞后,甚至感觉像是“卡住”。请参阅[[https://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html]]

我会将您的代码重构为:

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);
});
}
}

关于java - 慢速 Swing GUI 启动时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58190956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com