2010-07-21 83 views
2

如何在運行時在Swing程序(Java)中添加和刪除組件(JButons,JTextField等),而無需使用NetBeans?我應該使用哪種佈局? 我希望用戶輸入用戶名&密碼,當他點擊提交按鈕時,會出現帶有新組件(JButtons,JTextField等)的新屏幕,我無法在運行時實現轉換。在運行時在Java(Swings)程序中添加並刪除JTextField

+1

我碰到的這個問題之前,所有的答案爲止似乎對我好;我已經在不同的場景中使用過它們。 – Feanor 2010-07-23 15:15:24

+0

考慮到他特別創建了用戶名/密碼面板,我不會選擇任何涉及將此面板用於其他目的的解決方案。這只是糟糕的設計練習。我可以想到其他情況下可以重複使用一個面板,但不是這個。 – 2010-07-23 15:52:22

回答

3

你想使用兩個不同的面板來實現這個結果。使用同一個面板並刪除所有第一個組件並添加所有第二個組件並不是一個好主意。

製作一個LoginPanel類,它列出用戶名和密碼字段,標籤和提交按鈕。然後,當按下提交按鈕時,在登錄通過身份驗證後,隱藏登錄面板並顯示一個新的面板,其中包含您希望爲下一個屏幕設置的佈局。

這種方法使維護兩個面板變得更加容易,並且清楚地將它們的佈局和功能彼此分開。

您可以使用此代碼在現有的面板中心這個新框架:

 
public static void centerFrameOverComponent(JFrame frame, JComponent component) { 
    Window parent = SwingUtilities.getWindowAncestor(component); 

    Rectangle frameRect = frame.getBounds(); 
    Rectangle parentRect = parent.getBounds(); 

    int x = (int) (parentRect.getCenterX() - frameRect.getWidth()/2); 
    int y = (int) (parentRect.getCenterY() - frameRect.getHeight()/2); 

    frame.setLocation(x, y); 
} 
+0

登錄後,如果我將一個JFrame的可見性設置爲false,然後將另一個JFrame的可見性設置爲true,則新的JFrame不會與最後一幀在屏幕上的位置對齊(假定用戶通過拖動更改了先前的JFrame的對齊方式您可以給我一個解決方案嗎?我應該在JFrame中使用JPanel嗎? – Gaurav 2010-07-23 19:10:57

+0

您可以在同一個框架中使用兩個面板並將它們交換出來,或者可以打開一個新框架並使用一些附加代碼居中: – 2010-07-23 19:30:18

2

,你可以創建thath延伸的JFrame exsample MyFrame一個新的類,以這種方式rapresetns新的窗口,在這個類,你必須在你的ContentPanel所有contolr添加的構造函數....

你可以添加一個jbutton到你的JFrame。

class MyFrame extends JFrame{ 

    private JButton jb= new JButton("hello"); 

    public MyFrame(){ 
     setSize(new Dimension(300,180)); //set the MyFrame size 
     getContentPane().add(jb); //add your Component at ContentPane 
    } 

} 

登錄後,你能告訴這樣你的新框架:

new MyFrame().setVisible(true); 
+0

如果我將一個JFrame的可見性設置爲false,然後設置另一個JFrame的可見性(登錄後),則新的JFrame不會與最後一幀在屏幕上的位置對齊(假定用戶通過拖動更改了以前的JFrame的對齊方式窗戶。你能給我一個解決辦法嗎? – Gaurav 2010-07-23 18:55:39

3

一種方法是使用CardLayout。您的登錄按鈕處理程序將檢查憑據並使用show()來顯示第二個窗格。

附錄:爲安全起見,請考慮使用JPasswordField作爲密碼;爲方便起見,用於定位框架的參數爲setLocationRelativeTo()

+1

我認爲show()不推薦使用,應該使用setVisible(true) – 2010-07-23 19:33:16

+0

@Phobia:'CardLayout#show()'不會被棄用。也許你正在考慮'Window#show()':http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/awt/Window.html – trashgod 2010-07-23 20:32:18

+0

setLocationRelativeTO(null)是非常好的API中心對齊框架,感謝trashgod。 – Gaurav 2010-07-24 06:46:10

3

另一種方法是在您希望隱藏它時在特定組件上調用setVisible(false)

在我一直想添加/刪除整個子板的情況下,我使用了以下內容:

panel.remove(subPanel); 
panel.revalidate(); 
panel.repaint(); 

你想打電話,只要你添加/刪除組件後兩種方法。