gpt4 book ai didi

java - 在程序启动时操作 Swing 组件的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 08:36:38 27 4
gpt4 key购买 nike

我正在使用 NetBeans 在 Swing 中创建一个应用程序。我希望能够在窗口可见后在启动期间(仅一次)操作某些组件,例如更新进度栏。为此,我有应用程序的主类,称为 MainWindow:

public class MainWindow extends JFrame
{

public MainWindow()
{
initComponents(); // NetBeans GUI builder-generated function for setting
// up the window components

}

public void Init()
{
loadLabel.setText("Loading....");
loadProgressBar.setValue(20);
doSomething();
loadProgressBar.setValue(40);
doSomething();
loadProgressBar.setValue(80);
doSomething();
loadProgressBar.setValue(100);

loadLabel.setVisible(false);
loadProgressBar.setVisible(false);
}

/* .... */

public static void main(String args[])
{
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
mainHandle = new MainWindow();
mainHandle.setVisible(true);
mainHandle.Init();
}
});
}

}

问题是无法观察到 Init() 函数中更新进度条(或操作任何其他 GUI 组件)的语句的效果。如果从 main() 内部调用 Init() 函数(如上所示),则窗口出现,但为空,Init() 函数执行并返回,仅此后窗口绘制其内容,但 Init() 所做的任何更改都不会生效。不可见,因为窗口一直是空的且不活动。我还尝试从 windowOpened() AWT 事件调用 init,该事件在窗口完全绘制后执行,但令人惊讶的是,在那里放置任何用于操作组件的语句似乎没有效果,或者更确切地说,它们被放入队列中,并在连续某个点,因此只能观察到最后一个点的效果(元素的隐藏)。我设法让它工作的唯一方法是删除整个invokeLater(new Runnable()...)咒语并将新的MainWindow()、setVisible()、Init()序列直接放在main()中,我想这是非常丑陋,打破了 gui 以线程方式运行的概念。这样做的正确方法是什么?当 gui 准备好被操作时,我应该在哪里放置要首先执行的代码,执行一次语句并将控制权返回到主事件循环?

我想目前这是这样工作的,当 Init() 函数正在运行时,GUI 组件上的任何操作都会被挂起(绘图线程不是独立的,并且等待 Init() 完成在执行操作之前)。也许我应该让 Init() 成为一个新线程......只是如何以及何种类型?

谢谢。

最佳答案

您可以将 EventQueue.invokeLater() 更改为 invokeAndWait(),并将对 init() 的调用移至第二个 EventQueue.invokeLater() 调用。

如果(看起来确实如此)doSomething() 花费了大量时间,更好的想法是将 Init 代码移至 SwingWorker 的主体中。 。这可以从 MainWindow() 构造函数执行,也可以在 main 中的 setVisible() 调用之后执行,这是拥有响应式 GUI 的惯用方法(以防用户厌倦等待并想要退出)并显示一些可见的进度迹象。

请参阅processpublish方法了解有关如何在 doSomething() 调用之间更新进度条的详细信息。

您可能还想查看ProgressMonitors另一种可以为您处理对话框等的替代方案。

关于java - 在程序启动时操作 Swing 组件的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1572993/

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