Java:第二个窗口为空

Java:第二个窗口为空,java,swing,awt,event-dispatch-thread,concurrency,Java,Swing,Awt,Event Dispatch Thread,Concurrency,我有一个奇怪的问题。。。我是一个相对较新的Java程序员(在以前的职业生涯中,我以破解Perl为生),从事我的第一个半真实应用程序。“Main Class”是MyApp类,它创建了一个UserInputDialog实例 UserInputDialog是我编写的一个类,它扩展了JFrame,实现了ActionListener和KeyListener,使用FlowLayout,并向用户显示了JLabel,JTextField,以及Cancel/OKJButton。当JTextField生成KeyEv

我有一个奇怪的问题。。。我是一个相对较新的Java程序员(在以前的职业生涯中,我以破解Perl为生),从事我的第一个半真实应用程序。“Main Class”是
MyApp
类,它创建了一个
UserInputDialog
实例

UserInputDialog
是我编写的一个类,它扩展了
JFrame
,实现了
ActionListener
KeyListener
,使用
FlowLayout
,并向用户显示了
JLabel
JTextField
,以及Cancel/OK
JButton
。当
JTextField
生成
KeyEvent
时,其中
keyereleased()==KeyEvent.VK_ENTER
,或者当“确定”按钮生成
ActionEvent
时,
UserInputDialog
执行一些输入验证,调用
setVisible(false)
,然后调用
MyApp.doSomething>(JTextFieldInstance.getText())

这一切都很好。但现在我正在尝试为
MyApp
添加一个进度窗口,因为
doSomething()
有时需要相当长的时间才能完成

我创建了
ProgressWindow
类,它扩展了
JFrame
,使用
BorderLayout
,并在
NORTH
中抛出一个
JProgressBar
和一个
JScrollPane
(包装一个
JTextArea
)当从
ProgressWindowTester
实例化并提供测试数据时,
CENTER
中的
ProgressWindowTester
将循环测试复制并粘贴到
MyApp
中,并且没有
MyApp
实例化
UserInputDialog
(也就是说,
MyApp
中没有什么固有的原因导致这种行为;这似乎是
UserInputDialog
ProgressWindow
之间的某种我不理解的交互)

但当我尝试按预期在
MyApp
中使用
ProgressWindow
时,即
ProgressWindow
setVisible(true),我会得到一个空白的摆动窗口(大小合适,标题栏设置正确)。不会出现
JProgressBar
JScrollPane/JTextArea
组件。
ProgressWindow
方法被
MyApp
正确调用(
System.err.println()
消息显示正确的交互),一切似乎都正常工作,只是在
ProgressWindow
中应该可见的组件不正常

我可以发布代码片段,但它有点复杂,我可能只是遗漏了一些明显的东西

我通常熟悉分离UI和业务逻辑的概念(例如,我在构建Perl应用程序时使用了
HTML::Template
Class::DBI
CGI::Application
),但我不确定我在Java中是否“做得对”

提前谢谢

哦,我在两个环境中得到了完全相同的行为:Mac OS X 10.6.8(“雪豹”)上的JavaC1.6.0_29;Fedora 15 Linux发行版上的JavaC1.7.0_02[1],内核2.6.31.10-3,LXDE桌面环境


[1] 直接从oracle.com下载;我没有使用OpenJDK(我知道jdk7是基于OpenJDK的)或者gcj或者类似的东西,您在Swing中遇到了一个并发问题,您试图在Swing事件线程或EDT上执行一个长时间运行的进程。由于该线程负责绘制所有组件和处理用户输入,如果它被长时间运行的进程所束缚,您的GUI将被有效地冻结,直到process已完成。关键是使用后台线程,如SwingWorker为长时间运行的进程提供的线程,因此事件线程不会被锁定。有关此方面的详细信息,请查看。有关如何将进度条与后台线程一起使用的其他细节,请查看

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


哦,欢迎访问StackOverflow.com!

没有代码很难判断,但可能是一个Swing线程问题,特别是如果在Swing线程上执行长时间运行的任务:+1我同意!这里有一个相关示例。是的,还有另一个相关示例。