Passando variáveis em Java ActionListener?
-
25-09-2019 - |
Pergunta
Existe uma maneira para eu passar variáveis em um actionlistener, sem chamá-los como final?Eu gostaria de usar estes dois pontos dentro de algum tipo de cronometrado forma...Eu tentei Thread.sleep (), mas por algum motivo ele não malha bem com o resto do programa.Este é o formato que eu realmente gostaria de usar, mas eu estou ciente de que pode ser impossível para fazê-lo funcionar.Estou aberto a todo e qualquer conselho.Obrigado!
(Me desculpe se esta é uma pergunta estúpida, eu procurei a resposta, mas apenas não pode parecer para encontrar um.)
public void timedMain(Point current, Point wanted){
ActionListener taskPerformer = new ActionListener(){
public void actionPerformed(ActionEvent evt){
System.out.println(wanted+" "+current);}};
actiontimer = new Timer(delay, taskPerformer);
actiontimer.start();}
Solução
Você pode fazer isso, o que evita declarar os parâmetros como final.
public void timedMain(Point current, Point wanted) {
final Point c = current;
final Point w = wanted;
ActionListener taskPerformer = new ActionListener(){
public void actionPerformed(ActionEvent evt){
System.out.println(w + " " + c);}};
actiontimer = new Timer(delay, taskPerformer);
actiontimer.start();}
Ou você pode alterar os tipos de current
e wanted
de modo que eles eram mutáveis Point
titulares, e tem o actionPerformed
método de olhar para os valores atuais titulares.
Mas não há nenhuma maneira para declarar a classe interna para que possa ver as alterações feitas a uma variável em um delimitador escopo do método ...se é isso que você está tentando fazer.
Outras dicas
Você poderia fazer algumas coisas
você pode promover a ação anônimos ouvinte para um privado (estático) classe interna, e passar os argumentos para o construtor
pode-se definir uma função que construiu um anônimo ação do ouvinte, em vez de embutidos no código, e fazer o parâmetros para essa função final
O que há de errado com apenas marcá-los 'final', embora?