2013-01-08 533 views
0

我有一个JPanel内部的所有对象采用JTextField大小的异常问题。即使我试图强制其他对象的大小,他们仍然将文本字段指定的大小视为自己的大小。例如,我试图建立一个单一的面板在它自己的方法如下:Java Swing JPanel对象大小全部匹配JTextField大小

private JPanel setupID() { 
    JLabel projLbl = new JLabel("Project ID:"); 
    JButton verifyBtn = new JButton("Verify ID"); 
    projID = new JTextField(25); 
    verifyBtn.setToolTipText("Verifies that the entered ID is not already in use."); 
    JPanel theID = new JPanel(new GridLayout(1,0)); 
     theID.add(projLbl); 
     theID.add(projID); 
     theID.add(verifyBtn); 
    return theID; 
} 

什么我最终是看起来像这样的窗口...... enter image description hereJFrame frame;,这是正装成为具有调用它的frame.pack()方法来自动调整帧大小。如果我在不同区域(例如WEST,CENTER,EAST)的BorderLayout()中创建单个对象,它们将按预期工作,但是当它们加载到面板中时,它们的大小均基于JTextField(25)。任何想法,为什么这是?

+1

这是GridLayout的行为。如果您想要更多地控制GUI中每个组件的大小,则需要选择其他LayoutManager。要快速查看标准布局管理器之间的差异,请选中[此处](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)。 –

+0

@代码大师你真的需要做出答案并添加一个例子! – MadProgrammer

+0

感谢链接代码大师,这有助于描述不同的布局类型。 – DGolberg

回答

2

正如Code-Guru和asemax指出的那样。看起来您正在使用GridLayout,该设计旨在使用可用空间平均布置网格中的组件。

尝试使用有点像GridBagLayout,而不是...

enter image description here

public class BadLayout08 { 

    public static void main(String[] args) { 
     new BadLayout08(); 
    } 

    public BadLayout08() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      add(new JLabel("Project ID:")); 
      add(new JTextField(25)); 
      add(new JButton("Verify ID")); 
     } 

    } 

} 

当你需要对要使用的布局决定你可能会发现一些使用A Visual Guide to Layout Managers

+0

这样做。我想我需要多花一点时间看看不同的布局。我仍然在尝试学习java,swing和AWS API,同时创建工作程序。计划是现在创建粗略的工作版本,然后在我学会了如何正确**编写有问题的程序后,返回并优化代码。啊,在没有训练的情况下学习工作的乐趣...再次感谢您的帮助! – DGolberg

2

从Java的documentation报价:

的网格布局类是勾画出一个容器的组件矩形网格布局管理器。容器被分成相等大小的矩形,并且一个部件放置在每个矩形[...]

我的猜测是矩形大小是基于所述最大组件的首选大小。 您应该使用替代布局,也许GridBagLayout更适合您的需求。