2012-09-16 41 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,尽管可能不会这样做当前的项目。 –

相关问题