【问题标题】:how to take value outside jbutton actionlistener?如何在 jbutton actionlistener 之外获取价值?
【发布时间】:2018-09-17 22:12:17
【问题描述】:

如何从 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 外部获取数据吗?有人可以帮帮我吗?

【问题讨论】:

    标签: java actionlistener jtextfield


    【解决方案1】:

    没有办法做到这一点。

    原因是ActionListener 在该方法的其余部分已经运行时稍后执行。

    因此,如果您想使用依赖于动作侦听器的东西,您必须将其移到那里(或者在从 ActionListener 调用的方法中。

    【讨论】:

      【解决方案2】:

      解决代码的某些部分依赖于异步执行代码中的值的问题的一种可能的通用模式是使用承诺(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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-01
        • 2013-11-02
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 2023-02-02
        • 2012-02-07
        相关资源
        最近更新 更多