【发布时间】:2013-12-21 02:04:28
【问题描述】:
我是学生,我正在和几个朋友一起做项目。我的任务是制作类似于类库的东西。这个库中的类应该为我的朋友提供 API,他必须使 GUI 成为应用程序的一部分。 GUI 可以由任何工具包制作(Swing、JavaFX、SWT、AWT,都应该可以工作,事实上,即使没有 GUI,它也应该可以工作)。我需要制作等待数据从网络到达的类。我不知道数据什么时候到达,并且 UI 必须在等待期间响应,所以我把它放在不同的线程中。现在的问题是如何让 GUI 在数据到达时做出响应。好吧,我认为这是异步事件,GUI 应该注册事件处理程序,并且我应该在事件发生时调用这些方法。我提出了这个解决方案:
interface DataArrivedListener{
void dataArrived(String data);
}
class Waiter{
private DataArrivedListener dal;
public void setDataArrivedListener(DataArrivedListener dal){
this.dal = dal;
}
void someMethodThatWaitsForData(){
// some code goes here
data = bufRdr.readLine();
//now goes important line:
dal.dataArrived(data);
// other code goes here
}
}
我的问题是: 我应该用这样的东西替换“重要”行吗:
java.awt.EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
dal.dataArrived(data);
}
});
或者类似的东西:
javafx.Platform.runLater(new Runnable(){
@Override
public void run(){
dal.dataArrived(data);
}
});
或者我应该做一些完全不同的事情?
问题是我不确定其中哪一个适用于任何类型的 UI。如果它是 GUI,dataArrived() 可能会对 GUI 进行更改,无论它是什么类型的 GUI,这些更改都应该正确地绘制在屏幕上。我还认为如果我“稍后调用此代码”会更好,以便我的 someMethodThatWaitsForData() 方法可以触发事件并继续它的工作。
感谢您的帮助。
【问题讨论】:
标签: java multithreading events user-interface