我有一个奇怪的问题......我是一个相对较新的“狂热爱好者”Java程序员(我曾经在以前的职业生涯中谋生Perl),正在开发我的第一个半实际应用程序。 “Main-Class”是MyApp
类,它创建一个UserInputDialog
实例。
UserInputDialog
是我撰写的一个课程,extend
s JFrame
,实施ActionListener
和KeyListener
,使用FlowLayout
,并向用户展示使用JLabel
,JTextField
和取消/确定JButton
。当JTextField
生成KeyEvent
keyReleased() == KeyEvent.VK_ENTER
时,或者“确定”JButton
生成ActionEvent
时,UserInputDialog
会进行一些输入验证,拨打setVisible(false)
,然后拨打MyApp.doSomething( JTextFieldInstance.getText() )
。
一切都很完美。但现在我正在尝试向MyApp
添加进度窗口,因为doSomething()
偶尔会花费相当长的时间来完成。
我创建了ProgressWindow
类,其扩展JFrame
,使用BorderLayout
,并在JProgressBar
和NORTH
中投掷JScrollPane
。 (包裹JTextArea
)in。CENTER
。从ProgressWindow
实例化并输入测试数据时,ProgressWindowTester
可以正常工作。如果我将ProgressWindowTester
的循环测试复制并粘贴到MyApp
并且没有MyApp
实例化UserInputDialog
(也就是说,没有任何内容),它也可以正常工作MyApp
中导致此行为的固有;它似乎是某种我不理解的互动,在UserInputDialog
和ProgressWindow
之间。
但是当我尝试在ProgressWindow
中使用MyApp
时,即ProgressWindow
setVisible(true),我得到一个空白的Swing窗口(大小合适,并且标题栏设置正确)。 JProgressBar
和JScrollPane / JTextArea
组件未显示。 ProgressWindow
正在MyApp
正在调用System.err.println()
方法(ProgressWindow
消息显示正确的互动),所有内容似乎都正常工作,只是,应该在HTML::Template
中显示的组件......不是。
我可以发布代码片段,但这有点令人费解,我可能只是错过了一些明显的东西......
我熟悉分离UI和业务逻辑的概念(例如,我在构建Perl应用程序时使用Class::DBI
和CGI::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或类似的东西
答案 0 :(得分:5)
你在Swing问题上有一个并发性,你试图在Swing事件线程或EDT上进行长时间运行。由于此线程负责绘制所有组件并处理用户输入,如果它被长时间运行的进程所束缚,则GUI将被有效冻结,直到该过程完成。关键是使用后台线程,例如SwingWorker提供的后台线程,用于长时间运行的进程,因此事件线程不会被锁定。查看Concurrency in Swing以获取更多相关信息。另请查看JProgressBar Tutorial以获取有关如何使用后台主题进度条的其他见解。
此外,您不希望使用JFrame,其中对话框(如JDialog)更合适。此外,您还希望避免在Swing中使用KeyListeners。更好的方法是简单地将ActionListener添加到JTextField,因为它的默认行为是响应按下键。
哦,欢迎来到StackOverflow.com!