Если вы покажете нам свой существующий код, это прояснит то, что вы пытаетесь сделать, но звучит так, как будто у вас есть один класс, который представляет вашу панель и также содержит ваш main
метод.Это возможно, но я бы не рекомендовал это, потому что это затеняет структуру приложения, хотя это популярный метод в учебниках, потому что он позволяет все помещать в один файл.
A WindowListener
представляет любой объект, которыйдолжен реагировать на события окна, то есть изменения в состоянии окна (в данном случае JFrame
), когда оно активировано, обозначено значком и т. д. Слушатель также может представлять графический компонент, но это не обязательно.
Вот очень простой пример, который, я надеюсь, проиллюстрирует концепции.Давайте создадим класс, представляющий тип панели, содержащий JLabel
, который будет отображать количество событий окна, которые произошли до сих пор.Он также реализует WindowListener
, так что он может получать уведомления об этих событиях и увеличивать счетчик каждый раз, когда он происходит.
Вы должны быть в состоянии скомпилировать и запустить этот код как есть, а затем наблюдать за счетчикомизмените, если свернуть / развернуть окно, щелкнуть другие окна и т. д.
import java.awt.event.*;
import javax.swing.*;
public class TestPanel extends JPanel implements WindowListener {
private JLabel label = new JLabel("No window events yet");
private int numEvents = 0;
public TestPanel() {this.add(label);}
private void update() {
label.setText(String.format("%d events",numEvents));
}
public void windowOpened(WindowEvent e) {
numEvents++;
update();
}
// ... similar implementations of the other WindowListener methods ...
}
Затем нам потребуется основная программа для создания экземпляра одной из наших панелей и отображения ее в виде JFrame
.
import javax.swing.*;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndDisplayGui();
}
});
}
private static void createAndDisplayGui() {
JFrame frame = new JFrame("Test Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TestPanel panel = new TestPanel();
frame.add(panel); // add the panel as a component in the frame
frame.addWindowListener(panel); // add the panel as a listener to the frame
frame.pack(); // lay out and size the frame
frame.setVisible(true); // display the frame
}
}