仅关闭一个Jframe窗口

时间:2014-04-09 21:55:52

标签: java swing user-interface jdialog multiple-instances

我有一个包含两种不同游戏的纸牌程序。为了访问游戏,我有一个菜单栏,其中包含一个包含地毯接龙和时钟接龙的游戏菜单。

默认情况下,程序在地毯纸牌中启动,我想选择游戏 - >然后,时钟纸牌会弹出一个带有时钟纸牌的新窗口和旧的地毯纸牌窗口。

目前我的程序将打开时钟窗口,但不会关闭旧的地毯窗口。

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 个答案:

答案 0 :(得分:2)

通过让您的类扩展JFrame,迫使您创建和显示JFrame,通常需要更多的灵活性,您在角落里画画。更好的解决方案:不要交换JFrame。而是使用CardLayout创建JPanel并显示它们并在 一个 JFrame中交换它们。

答案 1 :(得分:1)

如果您想使用一个JFrame,那么您可以创建一个私有JPanel,根据他选择的游戏重新绘制它...

否则,如果您只想要2个JFrame,则需要为每个JFrame创建一个引用变量。这意味着您需要为每次单击删除“新JFrame”,以便您可以控制它

在我的情况下,我会这样做;

private JFrame clockSolitaireFrame;

ClockSolitaire类将使用clockSolitaire变量来显示UI,并使用该变量以便将来能够关闭该帧。代码看起来与此类似;

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