2011-08-25 67 views
2

我迷失在Swing布局的恶梦:(我要揭露我的问题,但我正在寻找建议,以及明确的解决方案Swing布局问题

我的问题。我想设计一种形式是这样的:

private void initComponents() { 

    buttonGroup1 = new javax.swing.ButtonGroup(); 
    buttonGroup2 = new javax.swing.ButtonGroup(); 
    jPanel1 = new javax.swing.JPanel(); 
    jPanel2 = new javax.swing.JPanel(); 
    jTextField1 = new javax.swing.JTextField(); 
    jTextField2 = new javax.swing.JTextField(); 
    jPanel3 = new javax.swing.JPanel(); 
    jPanel4 = new javax.swing.JPanel(); 
    jRadioButton1 = new javax.swing.JRadioButton(); 
    jRadioButton2 = new javax.swing.JRadioButton(); 
    jRadioButton3 = new javax.swing.JRadioButton(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    setMinimumSize(new java.awt.Dimension(200, 200)); 

    jPanel1.setMinimumSize(new java.awt.Dimension(400, 44)); 
    jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS)); 

    jPanel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 255, 255))); 
    jPanel2.setMaximumSize(new java.awt.Dimension(11111111, 2147483647)); 
    jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2, javax.swing.BoxLayout.X_AXIS)); 

    jTextField1.setFont(new java.awt.Font("Lucida Grande", 0, 48)); // NOI18N 
    jTextField1.setText("jTextField1"); 
    jTextField1.setAlignmentY(0.0F); 
    jTextField1.setMaximumSize(new java.awt.Dimension(150, 2147483647)); 
    jTextField1.setPreferredSize(new java.awt.Dimension(100, 42)); 
    jPanel2.add(jTextField1); 

    jTextField2.setFont(new java.awt.Font("Lucida Grande", 0, 8)); // NOI18N 
    jTextField2.setText("jTextField2"); 
    jTextField2.setAlignmentY(0.0F); 
    jTextField2.setMaximumSize(new java.awt.Dimension(150, 2147483647)); 
    jTextField2.setPreferredSize(new java.awt.Dimension(100, 28)); 
    jTextField2.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jTextField2ActionPerformed(evt); 
     } 
    }); 
    jPanel2.add(jTextField2); 

    jPanel1.add(jPanel2); 

    jPanel3.setForeground(new java.awt.Color(255, 51, 51)); 
    jPanel3.setLayout(new javax.swing.BoxLayout(jPanel3, javax.swing.BoxLayout.LINE_AXIS)); 

    jPanel4.setLayout(new javax.swing.BoxLayout(jPanel4, javax.swing.BoxLayout.Y_AXIS)); 

    jRadioButton1.setText("jRadioButton1"); 
    jPanel4.add(jRadioButton1); 

    jRadioButton2.setText("jRadioButton2"); 
    jPanel4.add(jRadioButton2); 

    jRadioButton3.setText("jRadioButton3"); 
    jPanel4.add(jRadioButton3); 

    jPanel3.add(jPanel4); 

    jPanel1.add(jPanel3); 

    getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); 

    pack(); 
} 

东西我真的不明白的是:

enter image description here

而且我与Netbeans的生成代码挣扎当我更改jPanel3的布局时,ther是jPanel2的渲染更改!

有人可以给我一个howto的路径?

+0

无论如何,有人会推荐MigLayout,并且'某人'碰巧是我的 – Tedil

+2

+1。 :D –

+0

“当我更改jPanel3的latout时,ther是jPanel2的渲染更改!” - 你如何改变jPanel3的布局?使用GUIBuilder还是手动?如果手动,请尝试使用guibuilder来实现此目的。 –

回答

2

我建议使用GridBagLayout,因为它可以让您最好地控制组件的位置和占用的空间。

例如,为了使JPanel的2和3填满你的内容窗格中,您会怎么做:

GridBagConstraints constraints = new GridBagConstraints(); 
JPanel jPanel1 = new JPanel(new GridBagLayout()); 
constraints.fill = GridBagConstraints.HORIZONTAL; 
jPanel1.add(jPanel2, constraints); 
constraints.gridy ++; 
jPanel1.add(jPanel2, constraints); 

另外,如果你希望当您返回到它的Swing代码是可以理解的几天后,你会希望将其分解为函数并使用更多描述性变量名称,如“topTextPanel”和“middleButtonPanel”。

+0

为什么这个答案被低估了,我错过了这里的任何逻辑原因,这很可能,嗯:-)因为我会使用一些来自'嵌套布局'的无数变体:-) – mKorbel

+0

我个人是一个巨大的'GridBagLayout'和'GridBagConstraints'的粉丝。除了基本的对话框之外,我会非常推荐他们使用几乎任何的swing GUI。你从字面上可以对他们做任何事情,而且一旦你掌握了它,这一切都很容易。 – gnomed

+0

是的,我个人使用Facade Pattern来减少使用JPanel和GridBagConstraints的冗长性。 Swing的整个布局API本身非常令人痛苦。 –

2

类似的东西可能是使用BoxLayout的起点:

JPanel panel1= new JPanel(); 
panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS)); 

JPanel panel2= new JPanel(); 
panel2.setLayout(new BoxLayout(panel2, BoxLayout.X_AXIS)); 
panel2.setMinimumSize(...); panel2.setMaximumSize(...) ; panel2.setPreferredSize(...); 

JPanel panel3 = new JPanel(); 
panel3.setLayout(new BoxLayout(panel3, BoxLayout.X_AXIS)); 
panel3 .setMinimumSize(...); panel3 .setMaximumSize(...) ; panel3 .setPreferredSize(...); 

JTextField tf1 = new JTextField("text_field_1"); 
tf1.setMinimumSize(...); tf1.setMaximumSize(...) ; tf1.setPreferredSize(...); 

panel2.add(tf1); 
panel.add(panel2); 
panel.add(panel3); 
panel.add(Box.createVerticalGlue()); 
panel.add(Box.createRigidArea(new Dimension(...))); 
1

这是完全有可能与NetBeans。

但是,有三件事情你必须知道马蒂斯(在NetBeans Swing的设计)工作:

  1. 为了使容器适应周围的内容,你必须调整容器,直到它捕捉到内容。

  2. 要使内容跟随容器的大小,您必须调整内容的大小,直到它捕捉到容器的边界。

  3. 您可以随时手动配置通过右键单击组件的组件的自动调整大小行为,并选择你想要的自动调整大小子菜单下。