Закрыть только одно окно Jframe

У меня есть пасьянс, который содержит две разные игры. Для доступа к играм у меня есть строка меню с Игровым меню, содержащим Пасьянс Ковров и Пасьянс Часов.

По умолчанию программа запускается в пасьянсе Carpet, и я хотел бы выбрать Game -> Clock Solitaire, затем всплывающее окно с пасьянсом Clock и старое окно пасьянса Carpet, которое нужно закрыть.

В настоящее время моя программа откроет окно часов, но не закроет старое окно Carpet.

public void clockGame() {
    JButton[] buttons = {
            new JButton("Close"), new JButton("New Game")
    };

    final JDialog     dialog     = new JDialog(GUI, "Click a button");
    final JOptionPane optionPane = new JOptionPane("Would you like to start a new game of Clock Solitaire?", JOptionPane.INFORMATION_MESSAGE, JOptionPane.INFORMATION_MESSAGE, null, buttons, buttons[1]);

    buttons[0].addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            dialog.setVisible(false);
        }
    });

    buttons[1].addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // What can I put here to close the Carpet Window
            new ClockSolitaire(); 
            dialog.setVisible(false);
        }
    });

    dialog.setContentPane(optionPane);
    dialog.pack();
    dialog.setLocationRelativeTo(GUI);
    dialog.setVisible(true);
}

Что я могу добавить ко второму actionPerformed так старое окно закрывается?

2 ответа

Решение

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

иначе, если вы хотите только 2 JFrames, вам нужно создать ссылочную переменную для каждого JFrame. Это означает, что вам нужно удалять "новый JFrame" для каждого клика, чтобы получить контроль над ним

в моем случае я бы сделал;

private JFrame clockSolitaireFrame;

класс ClockSolitaire будет использовать переменную clockSolitaire для отображения пользовательского интерфейса и использовать эту переменную, чтобы иметь возможность закрыть кадр в будущем. код будет выглядеть примерно так;

    buttons[1].addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        clockSolitaireFrame.dispose();
        new ClockSolitaire(); 
        dialog.setVisible(false);
    }
});

Вы рисуете себя в углу, заставляя свой класс расширять JFrame, заставляя вас создавать и отображать JFrames, когда часто требуется большая гибкость. Лучшее решение: не меняйте местами JFrames. Скорее создайте JPanels, покажите их и поменяйте местами в одном JFrame, используя CardLayout.

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