我有一个纸牌程序,其中包含两个不同的游戏。要访问游戏,我有一个菜单栏,里面有一个包含地毯纸牌和时钟纸牌的游戏菜单。
默认情况下,程序在"地毯式纸牌"中启动,我想选择"游戏"->"时钟纸牌",然后弹出一个带有时钟纸牌的新窗口,并关闭旧的"地毯式单人纸牌"窗口。
目前,我的程序将打开时钟窗口,但不会关闭旧的地毯窗口。
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
添加什么以便关闭旧窗口?
当通常需要更大的灵活性时,让类扩展JFrame,迫使您创建和显示JFrame是在把自己描绘成一个角落。更好的解决方案是:不要交换JFrame。相反,创建JPanel并显示它们,并使用CardLayout在一个JFrame中交换它们。
如果你想使用一个JFrame,那么你可以创建一个私人JPanel,根据他选择的游戏重新绘制它。。。
否则,如果只需要2个JFrame,则需要为每个JFrame创建一个引用变量。这意味着你需要为每次点击删除"新JFrame",这样你就可以控制它
在我的情况下,我会这样做;
private JFrame clockSolitaireFrame;
ClockSolitaire类将使用clockSolitare变量来显示UI,并使用该变量来能够在将来关闭帧。代码看起来与此类似;
buttons[1].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clockSolitaireFrame.dispose();
new ClockSolitaire();
dialog.setVisible(false);
}
});