Передача переменных в Java ActionListener? - PullRequest
2 голосов
/ 18 ноября 2010

Есть ли способ передать переменные в список действий, не называя их финальными? Я хотел бы использовать эти две точки в каком-то временном порядке ... Я попробовал Thread.sleep (), но по какой-то причине он плохо сочетается с остальной частью программы. Это формат, который мне бы очень хотелось использовать, но я знаю, что заставить его работать невозможно. Я открыт для любых советов. Спасибо!

(Извините, если это глупый вопрос, я искал ответ, но просто не могу его найти.)

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();}

Ответы [ 2 ]

4 голосов
/ 18 ноября 2010

Вы можете сделать это, чтобы избежать объявления параметров как окончательных.

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();}

Или вы можете изменить типы current и wanted, чтобы они были изменяемыми держателями Point, ипусть метод actionPerformed смотрит на текущие значения в держателях.

Но нет способа объявить внутренний класс так, чтобы он мог видеть изменения, внесенные в переменную в области видимости метода ... еслиэто то, что вы пытаетесь сделать.

1 голос
/ 18 ноября 2010

Вы могли бы сделать несколько вещей

  • вы могли бы преобразовать слушатель анонимного действия во внутренний класс (private static) и передать аргументы конструктору

  • вы можете определить функцию, которая создаст анонимный слушатель действия, а не встроить его в ваш код, и сделать параметры этой функции окончательными

А что плохого в том, чтобы просто пометить их как "окончательные"?

...