2011-08-27 38 views
1

我嘗試建立2類:LoginScreen類和MainScreen類我如何處理,當我改變屏幕

當我運行程序,它會顯示登錄屏幕第一,然後我用的用戶名和密碼登錄的Mainscreen是彈出,但登錄屏幕不會消失。我不知道如何正確處理它。

因爲我使用的方法是

公共無效的actionPerformed(ActionEvent的發送){ 字符串CMD = e.getActionCommand();

if (OK.equals(cmd)) { //Process the password. 
     char[] input = passwordField.getPassword(); 
     if (isPasswordCorrect(input)) { 
      javax.swing.SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        JFrameExample.main(null); 
       } 
      }); 
     } else { 
      JOptionPane.showMessageDialog(controllingFrame, 
       "Invalid password. Try again.", 
       "Error Message", 
       JOptionPane.ERROR_MESSAGE); 
     } 

     //Zero out the possible password, for security. 
     Arrays.fill(input, '0'); 

     passwordField.selectAll(); 
     resetFocus(); 
    } else { //The user has asked for help. 
     JOptionPane.showMessageDialog(controllingFrame, 
      "You can get the password by searching this example's\n" 
     + "source code for the string \"correctPassword\".\n" 
     + "Or look at the section How to Use Password Fields in\n" 
     + "the components section of The Java Tutorial."); 
    } 

}

我知道這是愚蠢的代碼並執行它錯誤的方式,但你可以指導我做適當的一個。

回答

3

我想這個方法是你的第一個屏幕的方法,它必須是一個JDialog或一個JFrame。只需撥打setVisible(false)即可隱藏幀(如果對話框不再使用,也可以撥打dispose())。

此外,你不應該調用JFrameExample的主要方法。主要方法通常用於啓動新的應用程序。只要做你的動作監聽器的主要方法(可能是new JFrameExample().setVisible(true))。

最後,總是在事件分派線程(EDT)中調用事件偵聽器,因此從事件偵聽器使用SwingUtilities.invokeLater沒有意義。

要回顧一下,這裏的代碼應該如何看起來像:

if (isPasswordCorrect(input)) { 
    setVisible(false); // or dispose(); 
    JFrame mainFrame = new JFrameExample(); 
    mainFrame.setVisible(true); 
} 
+1

好方向,正確的建議+1 – mKorbel

+0

THX你了,但我能做到這一點之前,我必須做 b.getParent()的getParent ().getParent()的getParent()的getParent()調用setVisible(假)。; 這對我很有趣:D –