2012-02-03 105 views
4

我有一个奇怪的问题......我是一个相对较新的“爱好者”的Java程序员(我曾经在以前的职业生涯中攻击Perl)真正的应用。 “主要类”是MyApp类,它创建了一个UserInputDialog实例。Java:第二个窗口是空的

UserInputDialog是一类我写的extend小号JFrame,实现ActionListenerKeyListener,使用FlowLayout,并呈现给用户一个JLabelJTextField,并取消/ OK JButton秒。当JTextField生成KeyEvent,其中keyReleased() == KeyEvent.VK_ENTER或者当“OK”JButton生成ActionEvent时,UserInputDialog进行一些输入验证,调用setVisible(false),然后调用MyApp.doSomething(JTextFieldInstance.getText())

这一切都完美的作品。但是现在我正试图将一个进度窗口添加到MyApp,因为doSomething()偶尔会花费相当长的时间来完成。

我创建ProgressWindow类,它扩展JFrame,使用BorderLayout,并扔在JProgressBarNORTHJScrollPane(包装JTextArea)。 CENTER。当从ProgressWindowTester实例化并馈送测试数据时,ProgressWindow完美工作。它也能正常工作,如果我复制并粘贴从ProgressWindowTester循环考不上MyApp并没有MyApp实例化UserInputDialog(即没有什么固有MyApp是造成这种行为,这似乎是某种互动我不明白,在UserInputDialogProgressWindow之间)。

但是当我尝试在MyApp使用ProgressWindow如预期,即ProgressWindow调用setVisible(真),我得到了一个空白的Swing窗口(在适当的大小,并与标题栏设置不当)。不出现JProgressBarJScrollPane/JTextArea组件。通过MyApp正确调用ProgressWindow方法(System.err.println()消息显示正确的交互),一切似乎都正常工作,只是,应在ProgressWindow中显示的组件不是。

我可以张贴代码片段,但它是一种令人费解,而且我可能只是缺少明显的东西...

我所熟悉的一般分离UI和业务逻辑(概念如我使用HTML::TemplateClass::DBICGI::Application时,构建Perl应用程序),但我不知道我在Java中“做对了”...

在此先感谢!

噢,我在两种环境下的测试完全一样:Mac OS X 10.6.8(“Snow Leopard”)上的javac 1.6.0_29;和Fedora 15 Linux发行版,内核2.6.31.10-3,LXDE桌面环境中的javac 1.7.0_02 [1]。

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

+2

很难说没有代码,但可能是一个Swing线程问题,特别是如果在Swing线程上执行长时间运行的任务:http://java.sun.com/products/jfc/tsc/articles /threads/threads1.html – DNA 2012-02-03 22:29:57

回答

5

你有在Swing问题并发,你正在试图做的秋千上事件长期运行的进程线程或EDT。由于此线程负责绘制所有组件并处理用户输入,因此如果它受到长时间运行的进程的束缚,则GUI将被有效冻结,直到该进程完成。关键是使用后台线程(如SwingWorker提供的后台线程)来处理长时间运行的进程,这样事件线程就不会被锁定。查看Concurrency in Swing了解更多信息。另请查看JProgressBar Tutorial了解有关如何使用进度条与后台线程的其他见解。

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

哦,欢迎来到StackOverflow.com!

+2

+1我同意!有一个相关示例[这里](http://stackoverflow.com/a/4637725/230513)。 – trashgod 2012-02-04 01:28:32

+0

是的,还有另一个相关的例子[这里](http://stackoverflow.com/questions/8251607/running-a-jframe-with-a-jprogressbar/8251620#8251620)。 – 2012-02-04 03:07:58