2012-11-16 71 views
2

JComboBox組件放在GroupLayout中時,我遇到了一種奇怪的行爲。我已經將代碼縮減到了下面的最小示例中,其中只有一個JComboBoxGroupLayout排列。JComboBox與GroupLayout搭配不好

所觀察到的行爲如下:

  • 當幀比所述膨脹組合框列表的情況下(與A,B,C虛擬條目),點擊小向下箭頭組合框打開它正確。
  • 當我調整框架的尺寸大於展開的組合框列表時,展開的組合框列表不會打開!

我已經找到了已經:

  • 當的JComboBox的父窗口太小,javax.swing.PopupFactory創建HEAVY_WEIGHT_POPUP組件。
  • 當父窗口足夠大時,正在創建LIGHT_WEIGHT_POPUP。
  • 該行爲與GroupLayout或其一些副作用無疑是相關的,因爲我嘗試過的其他版式管理器工作得很好。
  • 在GroupLayout中使用addGap()時,問題會發生一些變化,即JComboBox不顯示變化的窗口大小。

這是示例代碼 - 評論,歡迎:

import java.awt.BorderLayout; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JRootPane; 

public class DummyUI_cbdiagnosis extends javax.swing.JPanel { 
    private javax.swing.JComboBox cbCategory; 

    public DummyUI_cbdiagnosis() { 
     initComponents(); 
    } 

    private void initComponents() { 
     cbCategory = new JComboBox(); 
     cbCategory.setModel(new javax.swing.DefaultComboBoxModel(new String[] { 
       "a", "b", "c" })); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 
     this.setLayout(layout); 
     layout.setHorizontalGroup(layout.createParallelGroup(
       javax.swing.GroupLayout.Alignment.LEADING).addGroup(
       layout.createSequentialGroup().addComponent(cbCategory, 
         javax.swing.GroupLayout.PREFERRED_SIZE, 
         javax.swing.GroupLayout.PREFERRED_SIZE, 
         javax.swing.GroupLayout.PREFERRED_SIZE))); 
     layout.setVerticalGroup(layout.createParallelGroup(
       javax.swing.GroupLayout.Alignment.LEADING).addGroup(
       layout.createSequentialGroup().addComponent(cbCategory) 
     )); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JRootPane rootPane = frame.getRootPane(); 
     rootPane.setLayout(new BorderLayout()); 

     DummyUI_cbdiagnosis panel = new DummyUI_cbdiagnosis(); 
     rootPane.add(panel, BorderLayout.NORTH); 

     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

如果您導入包名稱,則不必顯式調用包名稱... – Mordechai

回答

5

永遠不要將組件添加到RootPane本身,而將它們添加到contentPane

frame.add(panel); 

frame.setContentPane(panel); 

一個RootPane有哪裏放控制:

  • 菜單欄。
  • 內容。
  • 玻璃窗格。
  • 最重要的,輕量級彈出窗口(INC。JComboBox),對話,拖動和下降等

RootPane使用一個特殊的佈局管理器叫做RootLayout,而不是應改爲BorderLayout

+0

您能解釋爲什麼我無法添加到根窗格嗎? –

+0

+1正確答案不知道爲什麼downvoted – mKorbel

+0

不是你的down-voter,但'frame.add()'_forwards_到內容窗格,使'getContentPane()'多餘; 'frame.setContentPane()'_replaces_內容窗格,可能是無意的。更多[這裏](http://stackoverflow.com/a/11769153/230513)。 – trashgod

相關問題