Java:第二个窗口是空白的

时间:2012-02-03 22:24:09

标签: java swing awt event-dispatch-thread concurrency

我有一个奇怪的问题......我是一个相对较新的“狂热爱好者”Java程序员(我曾经在以前的职业生涯中谋生Perl),正在开发我的第一个半实际应用程序。 “Main-Class”是MyApp类,它创建一个UserInputDialog实例。

UserInputDialog是我撰写的一个课程,extend s JFrame,实施ActionListenerKeyListener,使用FlowLayout,并向用户展示使用JLabelJTextField和取消/确定JButton。当JTextField生成KeyEvent keyReleased() == KeyEvent.VK_ENTER时,或者“确定”JButton生成ActionEvent时,UserInputDialog会进行一些输入验证,拨打setVisible(false),然后拨打MyApp.doSomething( JTextFieldInstance.getText() )

一切都很完美。但现在我正在尝试向MyApp添加进度窗口,因为doSomething()偶尔会花费相当长的时间来完成。

我创建了ProgressWindow类,其扩展JFrame,使用BorderLayout,并在JProgressBarNORTH中投掷JScrollPane。 (包裹JTextArea)in。CENTER。从ProgressWindow实例化并输入测试数据时,ProgressWindowTester可以正常工作。如果我将ProgressWindowTester的循环测试复制并粘贴到MyApp并且没有MyApp实例化UserInputDialog(也就是说,没有任何内容),它也可以正常工作MyApp中导致此行为的固有;它似乎是某种我不理解的互动,在UserInputDialogProgressWindow之间。

但是当我尝试在ProgressWindow中使用MyApp时,即ProgressWindow setVisible(true),我得到一个空白的Swing窗口(大小合适,并且标题栏设置正确)。 JProgressBarJScrollPane / JTextArea组件未显示。 ProgressWindow正在MyApp正在调用System.err.println()方法(ProgressWindow消息显示正确的互动),所有内容似乎都正常工作,只是,应该在HTML::Template中显示的组件......不是。

我可以发布代码片段,但这有点令人费解,我可能只是错过了一些明显的东西......

我熟悉分离UI和业务逻辑的概念(例如,我在构建Perl应用程序时使用Class::DBICGI::Application和{{1}}),但我不是确定我在Java中“做得对”...

提前致谢!

哦,我在尝试代码的两个环境中得到了完全相同的行为:Mac OS X 10.6.8上的javac 1.6.0_29(“Snow Leopard”);和javac 1.7.0_02 [1]关于Fedora 15 Linux发行版,内核2.6.31.10-3,LXDE桌面环境。

[1]直接从oracle.com下载;我;我没有使用OpenJDK(我知道JDK 7基于OpenJDK)或gcj或类似的东西

1 个答案:

答案 0 :(得分:5)

你在Swing问题上有一个并发性,你试图在Swing事件线程或EDT上进行长时间运行。由于此线程负责绘制所有组件并处理用户输入,如果它被长时间运行的进程所束缚,则GUI将被有效冻结,直到该过程完成。关键是使用后台线程,例如SwingWorker提供的后台线程,用于长时间运行的进程,因此事件线程不会被锁定。查看Concurrency in Swing以获取更多相关信息。另请查看JProgressBar Tutorial以获取有关如何使用后台主题进度条的其他见解。

此外,您不希望使用JFrame,其中对话框(如JDialog)更合适。此外,您还希望避免在Swing中使用KeyListeners。更好的方法是简单地将ActionListener添加到JTextField,因为它的默认行为是响应按下键。

哦,欢迎来到StackOverflow.com!