如何从actionlistener外部访问值
jbtnOne.addActionListener(new ActionListener() {
private String ana_data;
@SuppressWarnings("override")
public void actionPerformed(ActionEvent le) {
ana_data=jtf.getText();
}
});
pos_pred=def_pred(f_path,ana_data,prob_p,poslen,pcount);
neg_pred=def_pred(f_path1,ana_data,prob_n,neglen,ncount);
我需要在之后给出的方法中从ActionListener外部获取数据吗?有人可以帮帮我吗?
答案 0 :(得分:0)
没有办法做到这一点。
原因是ActionListener
在方法的其余部分已经运行的时候执行得更晚。
因此,如果你想使用依赖于动作监听器的东西,你必须将它移动到那里(或者从ActionListener
调用方法。
答案 1 :(得分:0)
解决代码的某些部分依赖于异步执行的代码中的值的问题的一种可能的通用模式是使用promises(Java中的CompletableFuture
)。通常,建议在这种情况下异步设计整体代码,以便生成值的方法和需要该值的方法都可以在某些时间点进行。从您的问题来看,目前尚不清楚您是否可以在您的情况下以这种方式进行设计。所以我会假设你做不到。如果调用者不能异步操作并且需要在同步流中进行异步操作的结果,那么您将需要阻塞等待结果的线程:
CompletableFuture<String> anaDataPromise = new CompletableFuture<>();
jbtnOne.addActionListener(new ActionListener() {
@SuppressWarnings("override")
public void actionPerformed(ActionEvent le) {
anaDataPromise.complete(jtf.getText());
}
});
anaData = anaDataPromise.get(); // will block until action performed
// anaData = anaDataPromise.get(10, TimeUnit.MINUTE); // will block until action performed or for max of 10 minutes
如果您可以允许需要anaData
值的代码完全异步,那么您可以以非阻塞方式编写它:
CompletableFuture<String> anaDataPromise = new CompletableFuture<>();
jbtnOne.addActionListener(new ActionListener() {
@SuppressWarnings("override")
public void actionPerformed(ActionEvent le) {
anaDataPromise.complete(jtf.getText());
}
});
anaDataPromise.whenComplete((anaData, throwable) -> {
if (throwable != null) {
throw new RuntimeException(throwable);
}
// do something with anaData value
});
// this point is reached immediately as the above code simply declares
// the action that will run later, the actions themselves are not yet run