java - swing - оконный стекло - PullRequest
       38

java - swing - оконный стекло

2 голосов
/ 03 сентября 2011

Если я создаю класс и загружу объект этого класса в свой JFrame (класс в основном представляет собой панель с кнопками и текстовыми объектами, но это не имеет большого значения), который не создается до мой открытый статический void main (String [] args) {(который находится ниже кода класса), как мне связать WindowListener и других слушателей с этим JFrame, поскольку он не отделен от исходного класса?

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

Я прочитал http://download.oracle.com/javase/tutorial/uiswing/events/windowlistener.html и другие учебные пособия, но я хочу получить общий ответ и ответ на этот конкретный вопрос для моего приложения, потому что я часто сталкиваюсь с этим.

Спасибо всем, кто может помочь, или всем, кто читает это!

1 Ответ

5 голосов
/ 03 сентября 2011

Если вы покажете нам свой существующий код, это прояснит то, что вы пытаетесь сделать, но звучит так, как будто у вас есть один класс, который представляет вашу панель и также содержит ваш 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
    }
}
...