gpt4 book ai didi

java - 使用 JWindow 时结果不一致

转载 作者:行者123 更新时间:2023-12-02 09:47:20 25 4
gpt4 key购买 nike

我正在编写这个程序来在 JWindow 中显示 JProgressbar。但是在同一台机器上运行这个程序而不做任何更改每次都会显示不同的结果。大多数时候它显示空的 JWindow,里面没有任何东西。其他时候它显示了我期望它如何出现。我不知道出了什么问题。

我尝试过使用 JFrame。然后它就一直完美工作。但我想使用 JWindow。

这是我的代码:

package des;

import javax.swing.*;
import java.awt.*;

public class Test extends JWindow {
JPanel panel = new JPanel();
JLabel messageLabel = new JLabel();
JProgressBar progressBar = new JProgressBar(0, 100);
Test() {
setVisible(true);
setSize(480, 100);
setLocationRelativeTo(null);//put it in center of screen

messageLabel.setText("Hello World");
messageLabel.setAlignmentX(JLabel.CENTER);
progressBar.setValue(0);

panel.setLayout(new BorderLayout());
panel.add(messageLabel, BorderLayout.CENTER);
panel.add(progressBar, BorderLayout.SOUTH);
panel.setBackground(Color.cyan);
add(panel,BorderLayout.CENTER);



}

public static void main(String[] args) {
new Test();
}
}

我在 IntelliJ 中运行 Windows 10 64 位。这是我的 java 版本:

openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment (build 12.0.1+12)
OpenJDK 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)

最佳答案

调用setVisible(true)将触发事件调度线程(EDT)。一旦运行,每个更新 UI 的调用都应该在 EDT 内运行,例如通过调用 SwingUtilities.invokeLater() .

该规则有一些异常(exception),特别是当对象不可见(因此未呈现)时,会在构造函数中调用 UI 更新。一旦出现,此类调用应推迟到 EDT。

因此,您应该在构造函数中布局 GUI,并仅在所有内容都准备好渲染后才在最后调用 setVisible(true)

正如 @camickr 所指出的,所有 UI 对象构建也应该推迟到 EDT。不这样做可能会导致未定义的行为(即它可能工作也可能不起作用,因为 JSR 未指定它)

关于它没有显示的原因,我再次引用@camickr的评论:

The reason the code doesn't work is because components are added after the GUI is visible. By default components have a default size of (0, 0). So there is nothing to paint. If you add components to a visible GUI then you need to revalidate() and repaint() the Container the component was added to so the layout manager can be invoked.

关于java - 使用 JWindow 时结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56554015/

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