Java - вызов this.function() из составного объекта

У меня есть функция dodaj(); в JFrame, и в этом JFrame у меня есть JPanel. Чтобы использовать кнопки из JPanel, я использую ActionListener. Но когда кто-то нажимает на кнопку, я хочу вызвать функцию dodaj(); от JFrame. Если у меня есть ActionLIstener в JFrame, я могу использовать this.dodaj();, но у меня есть слушатель действий на JPanel, с композицией JFrame. Как я мог позвонить dodaj(); (Функция JFrame) из ActionListener с находится на JPanel?

Спасибо за чтение и извините за мой плохой английский.

2 ответа

Решение

Вы не упоминаете об этом, но ваши классы JFrame и JPanels оба, и поэтому ваша проблема заключается в том, что вы хотите вызвать метод из одного класса в другом классе? Если это так, ключ должен получить ссылку на класс JFrame и передать ее в класс JPanel через параметр конструктора или метода.

Например:

class MyFrame extends JFrame {
   private MyPanel myPanel;

   public MyFrame() {
      myPanel = new MyPanel(this);
   }

   public void frameMethod() {
      System.out.println("in JFrame's frameMethod");
   }

}

class MyPanel extends JPanel {
   private MyFrame myFrame;
   private JButton someButton = new JButton("Button");

   public MyPanel(final MyFrame myFrame) {
      this.myFrame = myFrame;

      someButton.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent arg0) {
            myFrame.frameMethod();
         }
      });
   }  
}

Кроме того, я не рекомендую расширять JFrame или JPanel без веских причин, таких как необходимость переопределения методов.

В вашем JPanel вы всегда можете вернуться к родительскому контейнеру JFrame с помощью getParent().

Если ваш ActionListener в JPanel является анонимным классом, вы можете напрямую ссылаться на него, используя метод getParent () напрямую. Если ваш ActionListener является отдельным классом, вы можете передать ему родительскую ссылку при создании его экземпляра.

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