2015-04-24 35 views
1

我使用的是JTabbedPane來控制幾個面板,每個面板都包含供用戶輸入信息的字段。意圖是用戶可以按任何順序填寫它們,並且可以返回來更改先前輸入的信息。在JabbedPane中使用JTextField格式化JPanel

JTabbedPane tabs = new JTabbedPane(); 
tabs.add("Attributes", attributesPanel); 
... 
frame.add(tabs); 

面板的每一個使用具有GridBagConstraints沿着GridBagLayout格式化的一切。當我不輸入任何內容並更改標籤時,一切似乎都沒問題。但是,當我在任何JTextField中輸入任何信息並更改標籤時,返回到標籤將顯示聚集在框架中心的所有內容。

Crushed image is crushed.

有誰知道爲什麼,可能是?再次,這隻發生,如果我實際上在文本字段中輸入的東西...

在面板中,一切都在構造函數初始化。下面是一些偏代碼:

protected EntityBuilderAttributesPanel() { 
     setPreferredSize(new Dimension(EntityBuilder.PANEL_WIDTH, EntityBuilder.PANEL_HEIGHT)); 

     setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 
     c.fill = GridBagConstraints.HORIZONTAL; 

     entityIdLabel = new JLabel("Entity Unique Identity"); 
     entityIdTextField = new JTextField(); 
     c.gridx = 0; 
     c.gridy = 0; 
     c.gridwidth = 1; 
     add(entityIdLabel, c); 
     c.gridx = 1; 
     c.gridwidth = 3; 
     add(entityIdTextField, c); 

     entityNameLabel = new JLabel("Entity Name"); 
     entityNameTextField = new JTextField(); 
     c.gridx = 0; 
     c.gridy = 1; 
     c.gridwidth = 1; 
     add(entityNameLabel, c); 
     c.gridx = 1; 
     c.gridwidth = 3; 
     add(entityNameTextField, c); 

     space_01 = new JLabel(); 
     space_01.setPreferredSize(new Dimension(EntityBuilder.PANEL_WIDTH, 25)); 
     c.gridx = 0; 
     c.gridy = 2; 
     add(space_01, c); 

     attributesLabel = new JLabel("Entity Attributes"); 
     c.gridx = 0; 
     c.gridy = 3; 
     c.gridwidth = 1; 
     add(attributesLabel, c); 
     attributes = new JList(EntityAttribute.values()); 
     attributes.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
     attributes.setLayoutOrientation(JList.VERTICAL); 
     attributes.setVisibleRowCount(10); 
     JScrollPane listScroller = new JScrollPane(attributes); 
     listScroller.setPreferredSize(new Dimension(EntityBuilder.PANEL_WIDTH, 400)); 
     listScroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     c.gridx = 0; 
     c.gridy = 4; 
     c.gridwidth = 4; 
     add(listScroller, c); 
[...] 
+0

當人們改變標籤或輸入數據時,你正在做什麼? –

+0

沒有!我沒有添加更改偵聽器或動作偵聽器,我不想... –

+0

您是否重新使用任何GridBagContraints或佈局管理器? –

回答

2
listScroller.setPreferredSize(new Dimension(EntityBuilder.PANEL_WIDTH, 400)); 

這個問題可能是因爲您要硬編碼一個首選大小。如果組件無法以其首選大小顯示,則GridBagLayout將使用最小大小。

改爲使用list.setVisibleRows(...)之類的方法,並讓列表組件確定高度/寬度。

//entityNameTextField = new JTextField(); 
entityNameTextField = new JTextField(10); 

在創建文本字段時指定一個數字,並再次讓文本字段確定合理的大小。

//space_01.setPreferredSize(new Dimension(EntityBuilder.PANEL_WIDTH, 25)); 
Box.createVerticalStrut(25); 

Swing已經提供了一個可以使用的透明組件,而不是使用JLabel。 Box組件會更高效,因爲它不像JLabel那樣使用UI,所以沒有任何東西可以繪製。

相關問題