2012-09-16 42 views
3

我有幾個這樣的含有用戶輸入JLabel S和JTextField在我的Swing應用程序JPanel秒。LayoutManager可以將JLabel或JTextField的高度與其字體大小進行匹配?

我手動編輯通過了NetBeans GUI Builder生成的代碼,但還是要保持一個類似的佈局。我開始使用GridLayout。我可以調整hgap讓我JLabel S和JTextField一個正確的大小,但我將不得不對所有的JPanel S的單獨做到這一點。

是否有標準的LayoutManager,它將基於組件的字體大小計算文本組件的正確高度,並在包含組件的空間和/或文本組件周圍填充包含組件?

編輯:

按照要求,這裏是一個SSCCE證明什麼,我試圖做

GridLayoutSSCCE:

package gridlayoutsscce; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class GridLayoutSSCCE { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame f = new JFrame("Grid Layout SSCCE"); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.add(new GridLayoutSSCCEPanel()); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 

GridLayoutSSCCEPanel:

package gridlayoutsscce; 

import java.awt.GridLayout; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

class GridLayoutSSCCEPanel extends JPanel { 
    public GridLayoutSSCCEPanel() { 
     this.setLayout(new GridLayout(2, 2)); 
     this.add(new JLabel("Label 1:")); 
     this.add(new JTextField()); 

     this.add(new JLabel("Label 2:")); 
     this.add(new JTextField()); 
    } 
} 

這我第一次運行時看起來很好 該程序。但是,當我調整窗口大小時,文本字段伸出,因此每個都填充窗口的一半高度。我希望它們保持與窗口大小調整時相同的高度。

+0

請修改您的問題以包含使用'GridLayout'並在封閉窗口調用'pack()'的[sscce](http://sscce.org/)。 – trashgod

+1

@trashgod完成。 –

+0

+1對於[sscce](http://sscce.org/)和其他解釋。 – trashgod

回答

4

GridBagLayout會做你想做的,但它是非常靈活的,它也考慮的最複雜的一個。

我敢肯定MigLayout會得到一提,但我從來沒有親自使用它,我還要提到JGoodies FormLayout,但同樣,我從來沒有使用過。

+0

根據更新的問題,我還會考慮'BoxLayout';以前投票表決。 – trashgod

+0

我之前使用過GridBagLayout。我忘了GridBagConstraints.fill。爲了能夠使用它,需要一些工作。 –

+0

@ Code-Guru沒有人說這很容易;) – MadProgrammer

1

朋友不會讓朋友使用GridBagLayout的

使用的JGoodies形成佈局,這樣做,你說什麼,你希望你的SSCCE做的(我們所有的朋友在這裏,不是嗎?):

class MyFormLayoutSSCCEPanel extends JPanel { 
    public MyFormLayoutSSCCEPanel() { 
    FormLayout layout = new FormLayout(
     "pref, pref:grow", // columns 
     "pref, pref");  // rows 
    this.setLayout(layout); 

    CellConstraints cc = new CellConstraints(); 
    this.add(new JLabel("Label 1:"), cc.xy(1,1)); 
    this.add(new JTextField(), cc.xy(2, 1)); 

    this.add(new JLabel("Label 2:"), cc.xy(1, 2)); 
    this.add(new JTextField(), cc.xy(2, 2)); 
    } 
} 

(請注意,這不會重現原來的SSCCE 的行爲究竟不過 - 我已經告訴它增長水平文本字段吃的所有可用空間)

我不建議交換到了JGoodies ÿ儘管如此,您至少需要幾周的時間才能在默認的Swing佈局管理器中感到沮喪,然後才能正確理解JGoodies formlayout爲您節省的工作量。

+0

感謝您的示例代碼「(請注意,這並不能重現原始SSCCE的行爲 - 我已經告訴它水平地生長文本字段以吃掉所有可用空間。)」這可能是一個很好的功能,我曾經有過在我的腦海裏,實際上在處理這個項目的時候,我已經使用了默認的Swing佈局管理器,這只是很長很長的一段時間,我一定會研究JGoodies,儘管可能不會這樣做當前的項目。 –

相關問題