2011-09-22 49 views
1

我如何才能退出他們從Main創建的新MainGame? 其中Main有一個原始的遊戲層。 MainGame是一個對話窗口(如模態窗口)。如何退出或退出從JWindow在Java中創建的從屬JWindow?

Main.java:(主代碼)

public class Main extends JWindow 
{ 
    private static JWindow j; 
    public static MainGame mp; 

    public static void main(String[] args) 
    { 
     new Thread(new Runnable() 
     { 
      public void run() 
      {    
      mp = new MainGame(); 
      mp.runit();    
      //mp.stopit(); 
      } 
     }).start(); 

     j = new Main(); 
     j.setVisible(true);    
    } 
} 

MainGame.java:(這是由主延伸,並且我想相當此只)。

public class MainGame extends JWindow 
{ 
    private static JWindow j; 
    public MainGame() 
    { 
    // some GUI ... 
    } 

    public static void runit() 
    { 
    j = new MainGame(); 
    j.setVisible(); 

    } 
} 
+0

什麼是所有的靜態變量?爲什麼不通過CardLayout交換視圖?另外,你是否注意在EDT上運行你的Swing代碼? –

+0

您正在濫用「靜態」關鍵字的用法。無論如何,第一:我認爲的方法是假設公共靜態無效的主要,而不是公共靜態無效的主要。其次,在你創建MainGame的線程中,你可以訪問'j'(作爲靜態變量),調用j.setVisible(false)來隱藏窗口。第三,您可以將父JWindow的引用傳遞給另一個類,以便一旦其他類自動初始化,就調用jWindow.setVisibile(false)。希望這可以幫助。 –

+0

@Usman Saleem:MainGame visible設置爲false並沒有什麼幫助。因爲在彈出窗口中我有一個3D電影作爲演示文稿播放,所以我想完全關閉那個jWindow對話框,以便以後我可以播放一個新的。 – YumYumYum

回答

3

1)更好地將工具CardLayout,作爲新Window創建Top-Level Container,那麼你就只能改用中間人卡

2)不產生大量的Top-Level Container上運行,因爲還有在JVM存儲器,直到當前實例存在,

  • 建立所需的數目和再利用,爲了避免可能的存儲器缺少

  • 那麼你必須調用setVisible(false)setVisible(true)

  • JWindow錯過設定方法setDefaultCloseOperation(Whatever);

3)如果你創建構造public JWindow(Frame owner),那麼你就直接撥打電話

SwingUtilities.getAccessibleChildrenCount()SwingUtilities.getWindowAncestor()

import javax.swing.*; 
import java.awt.*; 

public class Testing { 

    private JFrame f = new JFrame("Main Frame"); 
    private JWindow splashScreen = new JWindow(); 

    public Testing() { 
     splashScreen = new JWindow(f); 
     splashScreen.getContentPane().setLayout(new GridBagLayout()); 
     JLabel label = new JLabel("Splash Screen"); 
     label.setFont(label.getFont().deriveFont(96f)); 
     splashScreen.getContentPane().add(label, new GridBagConstraints()); 
     splashScreen.pack(); 
     splashScreen.setLocationRelativeTo(null); 
     splashScreen.setVisible(true); 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       readDatabase(); 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         createAndShowGUI(); 
        } 
       }); 
      } 
     }).start(); 
    } 

    public void readDatabase() { 
     //simulate time to read/load data - 10 seconds? 
     try { 
      Thread.sleep(2000); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void createAndShowGUI() { 
     JLabel label = new JLabel("My Frame"); 
     label.setFont(label.getFont().deriveFont(96f)); 
     f.add(label); 
     f.setLocationRelativeTo(null); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
     System.out.println("JFrame getAccessibleChildrenCount count -> " 
       + SwingUtilities.getAccessibleChildrenCount(f)); 
     System.out.println("JWindow getParent -> " 
       + SwingUtilities.getWindowAncestor(splashScreen)); 
     splashScreen.dispose(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       Testing t = new Testing(); 
      } 
     }); 
    } 
} 
2

我沒有真正進入你的設計。但有'j.dispose();'。 這應該工作。 here是java文檔。

通知:

  • 處置(); - 從內存中刪除窗口。
  • setVisibilty(false); - 只是從屏幕上隱藏它。
  • 你可以重寫'dispose()'函數在widow關閉的時候做某些事情(如果它的遊戲更新了分數),但是在重載函數結束時你必須調用'super.dispose();'所以調用類Window的函數。
+0

j.dispose()也破壞了主類。 – YumYumYum

+0

然後可能是mp.dispose(); 。任何你想要處理的窗口。調用它的功能。它可以從它裏面,像這樣:this.dispose();或者從另一個擁有對你想銷燬的窗口的引用的類中調用:windowObject.dispose(); –

+0

mp.dispose();什麼都不做。 – YumYumYum

2

而且MainGame是一個對話窗口

但是那你的代碼使用不算什麼。你使用JWindow。

您應該爲模態窗口使用JDialog。然後你只需處理()窗口。

+0

我試過了JDialog,但它保留了窗口欄。我無法使用無邊界JDialog? (就像我可以和JWindow一樣)。 – YumYumYum

+1

您仍然可以使用JDialog,只需使用未修飾的對話框即可。查看API的確切使用方法。 – camickr