Закрыть только одно окно 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.