Java:第二个窗口为空
我有一个奇怪的问题。。。我是一个相对较新的Java程序员(在以前的职业生涯中,我以破解Perl为生),从事我的第一个半真实应用程序。“Main Class”是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
MyApp
类,它创建了一个UserInputDialog
实例
UserInputDialog
是我编写的一个类,它扩展了JFrame
,实现了ActionListener
和KeyListener
,使用FlowLayout
,并向用户显示了JLabel
,JTextField
,以及Cancel/OKJButton
。当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我同意!这里有一个相关示例。是的,还有另一个相关示例。