2014-03-26 20 views
1

我在Swing中設計一個GUI。我想讓我的gui的一個特定區域 - 中心視圖 - 能夠響應行動事件而改變其顯示。無論顯示什麼,中心視圖的大小都不能改變。如何正確使用JPanel作爲其他幾個JPanel的容器?

現在當我有一個JPanelpanel1與一個優先的大小,並把它放入panel2沒有任何指定的大小,panel2將顯示完全符合panel1;你甚至不能看到雙層JPanel層。但由於我的中心框架(panel2)不應改變大小,因此我嘗試將panel2設置爲特定大小並給它一個BorderLayout。現在,如果我撥打panel2.add(panel1, BorderLayout.center )其中panel1與panel2具有完全相同的尺寸,雙層JPanel圖層可見並且中心視圖顯示爲不良。

如何將panel1添加到panel2,兩個panel2的尺寸相同,因此panel2不可見?或者更好的是,我應該怎麼做呢? (通過簡單的LayoutManagers

+2

使用CardLayout。谷歌會讓你到教程。 –

+0

有關示例,請參閱以下重複問題:[使用多個面板和一個框架創建GUI](http://stackoverflow.com/questions/8275728/creating-a-gui-with-multiple-panels-and-one - 框架) –

+0

@HovercraftFullOfEels我可能是非特定的。卡片示例不適用於我,因爲JButton將成爲處理這些更改的元素。 – user2651804

回答

4

我會補償一個答案,因爲它是規範這個問題的答案:

使用CardLayout。你可以找到教程here。 CardLayout將是確保中心JPanel,卡持有人JPanel不會改變大小的完美選擇。您可以從幾乎任何控制結構交換卡片,無論是由JButton或JComboBox持有的ActionListener。

例如:

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class CardExample extends JPanel { 
    enum MyColor { 
     RED("Red", Color.RED), YELLOW("Yellow", Color.YELLOW), BLUE("Blue", 
      Color.BLUE); 
     private String name; 
     private Color color; 

     private MyColor(String name, Color color) { 
     this.name = name; 
     this.color = color; 
     } 

     public String getName() { 
     return name; 
     } 

     public Color getColor() { 
     return color; 
     } 
    } 

    private static final int GAP = 3; 

    private CardLayout cardlayout = new CardLayout(); 
    private JPanel cardHolderPanel = new JPanel(cardlayout); 

    public CardExample() { 
     JPanel btnPanel = new JPanel(new GridLayout(1, 0, GAP, GAP)); 
     for (MyColor myColor : MyColor.values()) { 
     JPanel cardPanel = new JPanel(); 
     cardPanel.setPreferredSize(new Dimension(200, 200)); 
     cardPanel.setBackground(myColor.getColor()); 
     cardHolderPanel.add(cardPanel, myColor.getName()); 

     btnPanel.add(new JButton(new ButtonAction(myColor))); 
     } 

     setLayout(new BorderLayout(GAP, GAP)); 
     setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
     add(cardHolderPanel, BorderLayout.CENTER); 
     add(btnPanel, BorderLayout.SOUTH); 
    } 

    private class ButtonAction extends AbstractAction { 
     private MyColor myColor; 

     public ButtonAction(MyColor myColor) { 
     super(myColor.getName()); 
     this.myColor = myColor; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     cardlayout.show(cardHolderPanel, myColor.getName()); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("CardExample"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new CardExample()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

非常感謝;-) – user2651804

+0

「一個CardLayout將是完美的,以確保中心JPanel,持卡人JPanel,不會改變大小。」在你自己的例子中,你設置了你添加到'cardHolderPanel'的所有JPanel的維度。而那些文檔路徑並不總是像我想的那樣充滿信息。那麼,如果我向它添加不同大小的元素,cardHolderPane不會改變大小?它是否只有第一個添加/顯示的項目的大小?對於一般的目的,我在哪裏可以得到這些問題的答案,所以在旁邊? – user2651804

+1

@ user2651804:我知道這個佈局使用了所有卡的最大寬度和高度,作爲它的容器的首選尺寸。要知道這是事實,請查看CardLayout的'preferredLayoutSize(Container parent)'方法的源代碼,並且您會發現這實際上是正確的。你可以在這裏找到這個類的源代碼(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/awt/CardLayout.java)。 –