Как получить значение вне jbutton actionlistener?

как получить доступ к значению извне 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 внутри метода, указанного после этого? может кто-нибудь мне помочь?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
65
2

Ответы 2

Нет никакого способа сделать это.

Причина в том, что ActionListener выполняется позже, когда остальная часть метода уже запущена.

Поэтому, если вы хотите работать с чем-то, что зависит от слушателя действий, вам нужно переместить его туда (или в методе, который вызывается из ActionListener.

Один из возможных общих шаблонов для решения проблем, когда некоторая часть вашего кода зависит от значений из кода, выполняемого асинхронно, - это использование обещаний (CompletableFuture в Java). Как правило, в таких ситуациях рекомендуется разрабатывать весь код асинхронно, чтобы и метод, производящий значение, и метод, требующий значение, могли работать в какой-то момент даже в какой-то более поздний момент времени. Из вашего вопроса неясно, можете ли вы так спроектировать в вашем случае. Так что я предполагаю, что вы не можете. Если ваш вызывающий объект не может вести себя асинхронно и ему нужен результат асинхронной операции в синхронном потоке, вам нужно будет заблокировать поток, ожидающий результата:

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

Другие вопросы по теме