Pau*_*aul 1 java swing doevents
这样一段代码:
private void log(String message) {
LogBox.append(message + "\n");
}
private void log(Exception e) {
log(e.getMessage());
}
private void ConvertButtonActionPerformed(java.awt.event.ActionEvent evt) {
String url = UrlBox.getText();
if (url.isEmpty()) {
log("Empty URL");
return;
}
LogBox.setText("");
try {
log("URL "+url+" accepted. Trying to download...");
String content = URLConnectionReader.getText(url);
log("Downloaded. Parsing the content...");
//
} catch (Exception e) {
log(e);
}
}
Run Code Online (Sandbox Code Playgroud)
应该在每次调用后立即将每条消息输出到LogBox(JTextArea)log,但URL ... accepted仅在URLConnectionReader.getText(url)完成时输出.
有几种方法可以立即输出:
有一些简单的方法可以立即输出吗?我正在研究有关DoEvents以及如何在Java中执行此操作的问题,但我认为开始从多线程学习Java并不是一种正确的方法.
创建一个SwingWorker进行下载:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
a的作用ActionListener就是:监听用户操作,并通过程序启动对该操作的响应.
有时,程序的响应非常快,只涉及GUI.例如,在计算器应用程序中,您可以将侦听器附加到"等于"按钮,该按钮计算当前表达式的结果并将其写入文本框.这可以在侦听器方法中完成(尽管您可能希望将行为分开以进行测试).
如果对用户操作的响应是启动一些长时间运行的过程,例如下载和解析文件,那么您不希望在侦听器主体中执行此操作,因为它将冻结UI.相反,从侦听器中收集任何信息(在您的情况下,URL值),并启动a SwingWorker来处理程序的响应.
在我的意见,我建议之后,在移动的一切getText()成SwingWorker.这是因为,对我来说,响应是"如果您有有效的URL,则下载文件,并记录进度".正如我所看到的,测试空字符串是该响应的一部分.如果你想把空字符串测试留在监听器中,那很好,但是它不太可测试.
您必须将调用留在getText()侦听器的主体内部,因为您只能从事件派发线程访问Swing组件.如果将该调用移动到工作程序中,则它可能在文本框自行更新的同时访问文本框,从而导致数据损坏.
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |