Swing - вызов событий изнутри панели - PullRequest
5 голосов
/ 01 июня 2011

У меня есть простой графический интерфейс Swing с главным окном JFrame и его основная панель выводится из JPanel.На панели есть несколько кнопок, которые можно нажимать и генерировать события.

Я хочу, чтобы эти события влияли на данные, хранящиеся в JFrame, потому что это мое основное приложение - в нем есть несколько очередей для потоков, открытых потоков и т.

Так как мне заставить мою кнопку на панели вызывать обратные вызовы в родительском фрейме?Какова лучшая практика для Java / Swing?

Ответы [ 4 ]

3 голосов
/ 01 июня 2011

Для вызова методов в родительском фрейме вам нужна ссылка на родительский фрейм.Таким образом, конструктор вашего JPanel может быть объявлен так:

 public MyPanel(MyFrame frame){
    super();
    this.frame = frame;
    //the rest of your code
}

И в JFrame вы вызываете этот конструктор так:

  panel = new MyPanel(this);//this refers to your JFrame

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

  button1.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
           //do some stuff
           frame.someMethod();//invoke method on frame
           //do more stuff
      }
  });
1 голос
/ 01 июня 2011

Вы можете реализовать ActionListener в своем классе, который имеет JFrame (или расширяет его):

class MyPanelClass {
    public MyPanelClass(ActionListener al)
    {
        //...
        JButton myButton = new JButton("Button");
        myButton.addActionListener(al);
        //...
    }
}

class MainClass extends JFrame implements ActionListener {
    public void someMethod() {
        MyPanelClass mpc = new MyPanelClass(this);
    }

    @Override
    public void ActionPerformed(ActionEvent ev) {
        // your implementation
    }
}
1 голос
/ 01 июня 2011

Ознакомьтесь с этим руководством по использованию SwingWorker.

1 голос
/ 01 июня 2011

Используйте метод addActionListener для нужных кнопок, определяющих класс, реализующий ActionListener.

ActionListenerClass actionListenerObject = new actionListenerClass();
JButton b = new JButton("Button");
b.addActionListener(actionListenerObject);

public class ActionListenerClass implements ActionListener(){
 //or better : actionListenerClass extends AbstractAction
      public void actionPerformed(ActionEvent e) {
      }
}

EDIT:

Да, я знаю это. Но действие слушатель я хочу быть в родительском JFrame класс - это проблема

затем расширяет класс JFrame, создавая новый производный класс, реализующий желаемый интерфейс.

...