如何在不关闭Frame的情况下完全关闭JDialog

时间:2014-05-11 08:36:10

标签: java frame dispose jdialog

如何在不关闭第一帧的情况下完全关闭JDialog窗口?

我已经尝试过使用dispose(),但似乎它隐藏了JDialog而不是重新发布它的内存,尽管我认为这不是java API的真相。 当我从Frame窗口点击按钮时创建一个新的JDialog是正确的,然后我在JDialog类中创建一个Menu,并使用set方法将这个JDialog对象传递给Menu。当我选择菜单选项" GiveUp"时,我尝试使用dispose()关闭JDialog对象。我做错了什么,或者有人知道我遇到了什么样的问题?我已经花了几个小时试图解决这个问题 Ps:这是一款国际象棋游戏,它可以选择在当前比赛中放弃并开始一个新的比赛,但是一些物体在处理后丢失,大多数物体继续在屏幕的相同位置或在另一个位置。宾语。每次我使用System.exit(0)时游戏运行都很完美,但是当我使用dispose时它总会出现一些问题。

Frame

在玩游戏之前 Picture of JDialog window of the game before playing

处理前 Picture of JDialog window after playing for some time

处理后 Picture of JDialog window after dispose()

public class Janela extends JFrame implements ActionListener {
        JDialog d1;

       public Janela() {
        super("Jogo de Xadrez - v2.0");
        button = new JButton("Abrir JDialog");
        button.addActionListener(this);
        this.getContentPane().add(button, BorderLayout.SOUTH);
        this.setLocationRelativeTo(null);
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

    @Override
    public void actionPerformed(ActionEvent ae) {
        d1 = new TelaJogo();
 **//HERE I INTEND TO CREATE A NEW JDIALOG WINDOW EVERY TIME I CHOOSE THE OPTION "GIVEUP" FROM THE MENU BAR**
    }



        public class TelaJogo extends JDialog {
            private static int i=0;
            private Menu menu;

            public TelaJogo() {
            System.out.println(i++);
            this.setTitle("Jogo de Xadrez - v2.0");
            JDialog.setDefaultLookAndFeelDecorated(true);
            setSize(1000, 700);
            setLocation((Toolkit.getDefaultToolkit().getScreenSize().width) / 2 - getWidth() / 2, (Toolkit.getDefaultToolkit().getScreenSize().height) / 2 - getHeight() / 2);
            pack();
            menu = new Menu();
            menu.setTela(this); // I PASS TO THE MENU THE JDIALOG OBJECT
            setJMenuBar(menu.getMenu());
            setVisible(true);
            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            pack();
      }

菜单类的一些方法和重要部分:

 public final class Menu implements ActionListener {

         private static JMenuBar mb;
         private JMenu menuArquivo;
         JMenuItem sair, giveUp, comoJogar, sobre;
         static TelaJogo tela;

             public void setTela(TelaJogo t) {
                tela = t;
            }

        public JMenuBar getMenu() {
            return mb;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource().equals(sair)) {
                int opcao = JOptionPane.showConfirmDialog(null, "Tem certeza que deseja sair do jogo?", "Sair do Jogo", JOptionPane.YES_NO_OPTION);
                if (opcao == 0) {
                    System.exit(0); 
                }
            } else if (e.getSource().equals(sobre)) {
                JOptionPane.showMessageDialog(null, "Sobre");
            } else if (e.getSource().equals(giveUp)) {
                int opcao = JOptionPane.showConfirmDialog(null, "Tem certeza que deseja desistir do jogo?", "GiveUp", JOptionPane.YES_NO_OPTION);
                if (opcao == 0) {
                     tela.setVisible(false);
                     tela.dispose();
    **//HERE I TRY TO CLOSE THE JDIALOG WINDOW I'D LIKE TO USE SOMETHING LIKE SYSTEM.EXIT(0), BUT IT CAN'T CLOSE THE FRAME WINDOW**
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

我必须猜测,因为有太多的信息试图阅读所有信息,而太少的信息无法解决您的问题。从它们之前的位置出现在棋盘上的碎片的原因,在它们应该消失之后,几乎可以肯定不是因为没有“处置”碎片或者在“处置”后占据记忆。问题看起来就像你有一个数据结构,它描述了那些部分和在那些地方绘制它们的代码,并且在辞职后你没有清除那个数据结构。

祝你好运。