Hen*_*ord 4 java concurrency swing awt event-dispatch-thread
我有一个奇怪的问题......我是一个相对较新的"狂热者"Java程序员(我曾经在以前的职业生涯中为我的生活黑客攻击Perl),正在开发我的第一个半实际应用程序."Main-Class"是MyApp创建UserInputDialog实例的类.
UserInputDialog是一类我写了extends ^ JFrame,农具ActionListener和KeyListener,使用FlowLayout,并呈现给用户一个JLabel,JTextField以及取消/ OK JButton秒.当JTextField生成一个KeyEventwhere keyReleased() == KeyEvent.VK_ENTER,或者当"OK" JButton生成一个时ActionEvent,UserInputDialog做一些输入验证,调用setVisible(false),然后调用MyApp.doSomething( JTextFieldInstance.getText() ).
这一切都很完美.但现在我正在尝试添加进度窗口MyApp,因为doSomething()偶尔可能需要相当长的时间才能完成.
我创建了这个ProgressWindow类,它扩展JFrame,使用BorderLayout和抛出一个JProgressBar.NORTH和a JScrollPane(包装JTextArea)in.CENTER.ProgressWindow从ProgressWindowTester测试数据实例化并提供测试数据时,它可以完美地工 它也能正常工作,如果我复制并粘贴从环路测试ProgressWindowTester到MyApp,并没有MyApp实例化UserInputDialog(即没有什么固有的MyApp是造成这种行为,这似乎是某种形式的互动,我不理解的,之间UserInputDialog和ProgressWindow).
但是当我尝试按预期使用ProgressWindow时MyApp,即ProgressWindowsetVisible(true),我得到一个空白的Swing窗口(正确的大小,标题栏设置正确).在JProgressBar和JScrollPane / JTextArea组件不会出现.正确地ProgressWindow调用这些方法MyApp(System.err.println()消息显示正确的交互),一切似乎都正常工作,只是,应该在ProgressWindow......中可见的组件不是.
我可以发布代码片段,但它有点令人费解,我可能只是遗漏了一些明显的东西......
我熟悉一般分离UI和业务逻辑的概念(例如,我曾经HTML::Template和Class::DBI和CGI::Application构建Perl应用程序时),但我不知道我在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或类似的东西
你在Swing问题上有一个并发性,你试图在Swing事件线程或EDT上进行长时间运行.由于此线程负责绘制所有组件并处理用户输入,如果它被长时间运行的进程所束缚,则GUI将被有效冻结,直到该过程完成.关键是使用后台线程,例如SwingWorker提供的后台线程,用于长时间运行的进程,因此事件线程不会被锁定.查看Swing中的Concurrency以获取更多相关信息.另外,请查看JProgressBar教程,了解有关如何使用后台线程进度条的其他见解.
此外,您不希望使用JFrame,其中对话框(如JDialog)更合适.此外,您还希望避免在Swing中使用KeyListeners.更好的方法是简单地将ActionListener添加到JTextField,因为它的默认行为是响应按键.
哦,欢迎来到StackOverflow.com!