2014-05-11 6 views
-1

프레임 하나를 닫지 않고 JDialog 창을 완전히 닫는 방법은 무엇입니까?프레임을 닫지 않고 JDialog를 완전히 닫는 방법

나는 dispose()를 사용하여 이미 시도했지만 메모리 리얼리닝 대신 JDialog를 숨긴 것처럼 보입니다.하지만 자바 API에 대한 진실이 아니라고 생각합니다. 프레임 윈도우에서 버튼을 눌렀을 때 새 JDialog를 만든 다음 JDialog 클래스 내에서 Menu를 만들고이 JDialog 객체를 set 메서드를 사용하여 메뉴에 전달합니다. 내가 "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

jdialog.dispose()와 같은 것을 사용하면 dispose가이 JDialog와 관련된 모든 객체와 인스턴스를 제거하지 않는다는 뜻입니까? 수십 개의 객체에 null을 할당하는 대신이 JDialog와 관련된 대부분의 객체를 지우는 간단한 방법이 있습니까? –

+1

JDialog로부터 javadoc : "이 Window, 그 서브 컴퍼넌트, 및 소유 된 모든 아이가 사용하는 모든 네이티브 스크린 리소스를 해제합니다. 즉, 이러한 컴퍼넌트의 자원이 파기됩니다. 소비하는 모든 메모리가 OS에 돌려 주어집니다. , 그리고 그들은 표시 할 수없는 것으로 표시 될 것입니다. " 그래서 윈도우 리소스를 삭제합니다. 그것은 체스 조각에 대해 아무것도 알지 못할 것입니다. 제 생각에는 어딘가에 조각에 대한 참조가 들어있는 배열이나 무언가가있어 보드에있는 위치를 나타냅니다. 분명히해라. 당신은 많은 null 할당에 반대한다면 새로운 것을 할당 할 수 있습니다. – arcy

관련 문제