2010-11-09 82 views
4

全部,CardLayout - 使其佔用最少的空間

我有一個表單類型視圖我正在用Java創建。基於組合框的內容,我需要切換表單的某些方面。我正在使用cardlayout來做到這一點,並且它工作正常。

問題在於cardlayouts使用所添加的組件的所有首選尺寸的最大值來確定它們自己的首選尺寸。這意味着當我選擇了一個字段較少的選項時,由於切換器組件上的首選佈局大小,會有空白區域。

我試過在每次選擇更改時手動更改cardlayout面板的首選大小,但這沒有任何影響 - 面板總是適合所有組件的最大值。

combo.addItemListener(new ItemListener() { 
     public void itemStateChanged(ItemEvent e) { 
      Dimension preferredSize = null; 
      switch (combo.getSelectedIndex()) { 
       case 0: 
        preferredSize = panel0.getPreferredSize(); 
        break; 
       case 1: 
        preferredSize = panel1.getPreferredSize(); 
        break; 
       case 2: 
        preferredSize = panel2.getPreferredSize(); 
        break; 
       default: 
        assert false; 
      } 
      patternOptions.setPreferredSize(preferredSize); 
      c.show(patternOptions, TYPE[combo.getSelectedIndex()]); 
     } 
    }); 

在我想的時候選擇一個選項,需要更多空間的UI動態增長,當它需要更少的空間縮小,就像iTunes的SmartList的UI一言以蔽之:

alt text我知道這是一個稍微不同的問題,但它是說明我想要什麼 - 持有約束字段的面板正在增長,基於行數。我需要我的佈局根據數量增長基於組合框選擇的選項)

+0

回答在http://stackoverflow.com/questions/8277834/how-to-set-a-jframe-size-to-fit-the-cardlayout-displayed-jpanel – aditsu 2013-05-29 13:57:42

回答

2

您可以繼承CardLayout並覆蓋preferredLayoutSize方法,使其僅考慮當前卡。

爲確保框架的增長和收縮,您可能需要在設置內容大小後致電pack。不知道這是否會在所有情況下都有效(它可能不會縮小),但值得一試。

1

聽起來像你應該使用每個窗體的JDialog。

或者不要打擾使用CardLayout並手動刪除/替換每個面板,然後打包()對話框。