2012-02-21 150 views
4

我對Java的GUI編程確實很陌生,我做了大量的研究,並且找不到這個問題的答案。如何堆疊/覆蓋Java中的jPanel?

我有一個簡單JFrame與菜單,這JFrame裏面我有一個日誌形式JPanel(分別爲用戶輸入自己的用戶名和密碼),然後我想改變這種狀況JPanel另一個JPanel取決於什麼用戶想要這樣做。

這樣做的最好方法是什麼?我認爲堆疊JPanels是可以的。但在Netbeans中添加新的JLayeredPanels後,它們不堆疊。我在某處閱讀我應該使用Z排序或類似的東西,但我無法在設計師視圖中找到它。

恩,非常感謝您的耐心等待!

+11

考慮使用一個[CardLayout(http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)交換 「意見」。 – 2012-02-21 02:55:31

回答

7

CardLayout類有一個有用的API,可以滿足您的要求。使用像next(), first(), last()這樣的方法會很有幫助。 我準備了一個在父面板和/或框架內更改面板的簡單演示。 看看吧:

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

public class PanelChanger implements ActionListener 
{ 
    JPanel panels; 

    public void init(Container pane) 
    { 
     JButton switcher = new JButton("Switch Active Panel!"); 
     switcher.addActionListener(this); 

     JPanel login = new JPanel(); 
     login.setBackground(Color.CYAN); 
     login.add(new JLabel("Welcome to login panel.")); 

     JPanel another = new JPanel(); 
     another.setBackground(Color.GREEN); 
     another.add(new JLabel("Yeah, this is another panel.")); 

     panels = new JPanel(new CardLayout()); 
     panels.add(login); 
     panels.add(another); 

     pane.add(switcher, BorderLayout.PAGE_START); 
     pane.add(panels, BorderLayout.CENTER); 
    } 

    public void actionPerformed(ActionEvent evt) 
    { 
     CardLayout layout = (CardLayout)(panels.getLayout()); 
     layout.next(panels); 
    } 

    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("CardLayoutDemo"); 
     PanelChanger changer = new PanelChanger(); 
     changer.init(frame.getContentPane()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
}