как получить значение за пределами jbutton actionlistener?

avatar
AGNEL JEO 1417102
8 апреля 2018 в 11:16
91
2
0

как получить доступ к значению вне прослушивателя действий

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

Источник

Ответы (2)

avatar
Oleg Sklyar
8 апреля 2018 в 12:47
0

Один из возможных общих шаблонов для решения проблем, когда часть вашего кода зависит от значений из кода, выполняемого асинхронно, заключается в использовании промисов (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
avatar
Timothy Truckle
8 апреля 2018 в 11:23
0

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

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

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