如何在不关闭第一帧的情况下完全关闭JDialog窗口?
我已经尝试过使用dispose(),但似乎它隐藏了JDialog而不是重新发布它的内存,尽管我认为这不是java API的真相。 当我从Frame窗口点击按钮时创建一个新的JDialog是正确的,然后我在JDialog类中创建一个Menu,并使用set方法将这个JDialog对象传递给Menu。当我选择菜单选项" GiveUp"时,我尝试使用dispose()关闭JDialog对象。我做错了什么,或者有人知道我遇到了什么样的问题?我已经花了几个小时试图解决这个问题 Ps:这是一款国际象棋游戏,它可以选择在当前比赛中放弃并开始一个新的比赛,但是一些物体在处理后丢失,大多数物体继续在屏幕的相同位置或在另一个位置。宾语。每次我使用System.exit(0)时游戏运行都很完美,但是当我使用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**
}
}
}
答案 0 :(得分:1)
我必须猜测,因为有太多的信息试图阅读所有信息,而太少的信息无法解决您的问题。从它们之前的位置出现在棋盘上的碎片的原因,在它们应该消失之后,几乎可以肯定不是因为没有“处置”碎片或者在“处置”后占据记忆。问题看起来就像你有一个数据结构,它描述了那些部分和在那些地方绘制它们的代码,并且在辞职后你没有清除那个数据结构。
祝你好运。