Java: удаление объекта GUI из GUI - PullRequest
1 голос
/ 08 февраля 2010

Можете ли вы помочь мне здесь? Действительно простая проблема, но я просто не могу понять, каково ее решение!

Я кодирую приложение прослушивателя, которое работает в своем собственном потоке и прослушивает ServerSocket для входящих соединений.

Когда приходит соединение, в новом потоке создается новый объект «Сообщение», которому передаются входящие текстовые данные «messageData». Этот объект должен затем отобразить текст пользователю во всплывающем окне.

In Listener.java:

javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {

        Message.display(messageData);

    }
});

Затем в Message.java:

public Message {

    public static void display(String data) {

        Message message = new Message(data);

        message.initGUI();

    }

    String messageData;

    GUI gui;

    public Message(String data) {

        messageData = data;

        gui = new GUI();

    }

    public void initGUI() {

        gui.init();

        // add listeners
        gui.addOKListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                // close GUI
                javax.swing.SwingUtilities.invokeLater(new Runnable() {

                    public void run() {
                        gui.close();
                    }
                });

                gui = null;

            }
        });

    }

    public class GUI {
        do GUI stuff 
        ... initialise gui
        ... add components
        ... setVisible=true
    }
}

Идея состоит в том, что внутренним классом GUI является 'View', а объект Message является комбинацией модели и контроллера.

Каждый объект Message изначально создает себя с помощью статического метода Message.display(). Это означает, что может существовать неограниченное количество объектов Message, существующих независимо, и слушателю не нужно беспокоиться об их управлении.

Отлично. Однако теперь у меня есть проблема.

Когда пользователь нажимает «ОК» в графическом интерфейсе, я хочу (а) удалить / скрыть графический интерфейс И (б) удалить объект сообщения из памяти.

Как я могу сделать (а) и (б)? Я могу сделать (а) gui=null in gui.addOKListener() (см. Выше), но я не могу сделать (b), потому что у меня нет ссылки на объект Message.

Я пытался определить addOKListener () в Message.display(), но это не работает, потому что мне нужно сделать объект message, который я создаю final, поэтому message=null недопустимо.

Действительно простая проблема - я думаю, решение тоже простое. Это очень расстраивает ..

Большое спасибо

Будет

Ответы [ 3 ]

4 голосов
/ 08 февраля 2010

Если все, что вы хотите сделать, это отобразить диалоговое окно с коротким тестовым сообщением для пользователя, то будет намного проще, если вы используете JOptionPane и один из статических фабричных методов там.

Взгляните на учебник

1 голос
/ 08 февраля 2010

Если у вас есть всплывающее окно, то у вас где-то есть рамка. Фреймы - это объекты верхнего уровня, которые существуют, даже если никто не хранит на них ссылку (ну, виртуальная машина, вероятно, делает, но вы не обязаны).

Таким образом, решение состоит в том, чтобы дождаться нажатия кнопки «ОК» или «Закрыть» во всплывающем окне, а затем просто удалить его. Не храните ссылки на всплывающее окно, и виртуальная машина очистит вас.

1 голос
/ 08 февраля 2010

Вы не можете принудительно удалить объекты из памяти, но метод dispose может быть тем, что вы ищете для удаления GUI:

// close GUI
javax.swing.SwingUtilities.invokeLater(new Runnable() {

    public void run() {
        gui.dispose();
    }
});

Предполагается, что ваш класс GUI расширяется JDialog или JFrame

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...