Избегайте бесконечного цикла, когда класс Java Swing Action Listener расширяет другой класс - PullRequest
0 голосов
/ 12 мая 2018

Я прикрепил ActionListener к JButton в Swing.

Основной класс:

 class MainClass {

    String foo;
    JButton button = new JButton("cool button");

    public MainClass(String foo) {
        this.foo = foo;
        ...
        JFrame setup here
        ...

        button.addActionListener(new MyBtnListener(frame));
        System.out.println(getFoo());
    }

    public String getFoo() {
        return this.foo;
    }

}

Класс, реализующий методы ActionListener:

class MyBtnListener extends MainClass implements ActionListener  {

    private JFrame target;

    public MyBtnListener(JFrame target) {
        this.target = target;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("button clicked");
        //target.dispose();
    }

}

При компиляции код выдает что-то вроде этого: foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo (бесконечный цикл).Мне нужен класс ActionListener, чтобы иметь возможность доступа к методам в MainClass, при этом не вызывая конструктор многократно.Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Имея MyBtnListener extension MainClass и MainClass, создав MyBtnListener в его конструкторе, вы создали цикл, который длится до тех пор, пока в стеке вызовов есть место.

Movebutton.addActionListener(new MyBtnListener(frame)); для конструктора MyBtnListener как button.addActionListener(this); или без MyBtnListener extension MainClass, просто используйте его ActionListener.

class MainClass {
 String foo;
 JButton button = new JButton("cool button");

 public MainClass(String foo) {
    this.foo = foo;
    ...
    JFrame setup here
    ...

    button.addActionListener(new MyBtnListener());
    System.out.println(getFoo());
}

public String getFoo() {
    return this.foo;
}
}

class MyBtnListener implements ActionListener  {
@Override
public void actionPerformed(ActionEvent e) {
    System.out.println("button clicked");
}

}

0 голосов
/ 12 мая 2018

Ответ на ваш вопрос довольно прост: то, что вы ищете, называется «ссылка».

Просто добавьте приватное поле типа MainClass к слушателю и инициализируйте его в конструкторе.:

private final JFrame frame;
private final MainClass reference;

public MyBtnListener(final JFrame frame, final MainClass reference)
{
     this.frame = frame;
     this.reference = reference;
}

Тогда вы можете просто вызвать метод getFoo следующим образом:

final String foo = reference.getFoo();

Также очень важно, чтобы MyBtnListener класс не расширить класс MainClass.

...