2014-02-13 31 views
1

对齐一组元件与Swing布局管理器我想创建一个Swing形式。我怎么能在中心春季

的形式应类似于此:

____________________________________ 
|___________________________________X| 
|         | 
|    ________________  | 
|  label1 [________________]  | 
|    ________________  | 
|  label2 [________________]  | 
|         | 
|         | 
|      [Save] [Close] | 
|____________________________________| 

但我无法定心文本字段垂直。

下面是用于打开帧代码:

public class Main { 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       LayoutTest test = new LayoutTest(); 
       test.setVisible(true); 
      } 
     }); 
    } 
} 

这里是草签的字段和创建布局代码:

public class LayoutTest { 
    private JFrame testFrame; 

    JLabel label1; 
    JTextField field1; 

    JLabel label2; 
    JTextField field2; 

    JButton saveButton; 
    JButton closeButton; 

    public LayoutTest() { 
     testFrame = new JFrame(); 

     initProperties(); 
     initContent(); 
     initLayout(); 
    } 

    private void initProperties() { 
     testFrame.setTitle("Test"); 
     testFrame.setSize(1000, 800); 
     testFrame.setLocationRelativeTo(null); 
     testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    } 

    private void initContent() { 
     label1= new JLabel("Label 1"); 
     field1= new JTextField(25); 
     label1.setLabelFor(field1); 

     label2= new JLabel("Label 2"); 
     field2= new JTextField(25); 
     label2.setLabelFor(field2); 

     saveButton = new JButton("Save"); 

     closeButton = new JButton("Close"); 
     closeButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent event) { 
       System.exit(0); 
      } 
     }); 

     testFrame.add(label1); 
     testFrame.add(field1); 
     testFrame.add(label2); 
     testFrame.add(field2); 
     testFrame.add(saveButton); 
     testFrame.add(closeButton); 
    } 

    private void initLayout() { 
     SpringLayout layout = new SpringLayout(); 

     layout.putConstraint(SpringLayout.NORTH, label1, 10, SpringLayout.NORTH, testFrame.getContentPane()); 
     layout.putConstraint(SpringLayout.EAST, label1, -5, SpringLayout.WEST, field1); 

     layout.putConstraint(SpringLayout.NORTH, field1, 10, SpringLayout.NORTH, testFrame.getContentPane()); 
     layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, field1, -10, SpringLayout.HORIZONTAL_CENTER, testFrame.getContentPane()); 

     layout.putConstraint(SpringLayout.NORTH, label2, 10, SpringLayout.SOUTH, label1); 
     layout.putConstraint(SpringLayout.EAST, label2, -5, SpringLayout.WEST, field2); 

     layout.putConstraint(SpringLayout.NORTH, field2, 5, SpringLayout.SOUTH, field1); 
     layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, field2, -10, SpringLayout.HORIZONTAL_CENTER, testFrame.getContentPane()); 


     layout.putConstraint(SpringLayout.SOUTH, closeButton, -20, SpringLayout.SOUTH, testFrame.getContentPane()); 
     layout.putConstraint(SpringLayout.EAST, closeButton, -20, SpringLayout.EAST, testFrame.getContentPane()); 

     layout.putConstraint(SpringLayout.SOUTH, saveButton, -20, SpringLayout.SOUTH, testFrame.getContentPane()); 
     layout.putConstraint(SpringLayout.EAST, saveButton, -10, SpringLayout.WEST, closeButton); 

     testFrame.setLayout(layout); 
    } 

    public void setVisible(boolean visible) { 
     testFrame.setVisible(visible); 
    } 
} 

我试图将这些字段添加到然后在面板上使用SpringLayout.VERTICAL_CENTER,但没有显示出来。

我怎么能中心对齐等领域作为一个群体?

+0

你有使用' SpringLayout'? – MadProgrammer

+0

如果您可以建议一种简单的方法来创建我需要的表单而不需要添加太多额外的组件(例如面板等),那么我很乐意切换。 'SpringLayout'似乎是最灵活的,这是我无法用它做的唯一的事情。 –

+0

SpringLayout(与之后的GroupLayout相同)设计用于构建器,而不是手动构建。所以我会投资学习一些其他经理的怪癖,我个人目前的偏好是MigLayout – kleopatra

回答

1

根据您的需要,您有任意数量的选项。我更喜欢GridBagLayout,但那是因为我已经使用了15年。

Dialog 01

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FormLayout { 

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

    public FormLayout() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException 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()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.insets = new Insets(8, 8, 8, 8); 
      gbc.anchor = GridBagConstraints.EAST; 

      add(new JLabel("Label 1"), gbc); 
      gbc.gridy++; 
      add(new JLabel("Label 2"), gbc); 

      gbc.anchor = GridBagConstraints.WEST; 
      gbc.gridy = 0; 
      gbc.gridx++; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      add(new JTextField(20), gbc); 
      gbc.gridy++; 
      add(new JTextField(20), gbc); 

      gbc.gridy++; 
      gbc.gridx++; 
      gbc.gridwidth = 1; 
      gbc.anchor = GridBagConstraints.EAST; 
      gbc.weightx = 1; 
      add(new JButton("Save"), gbc); 
      gbc.weightx = 0; 
      gbc.gridx++; 
      add(new JButton("Close"), gbc); 
     }   
    }   
} 

这样做的问题,对我来说,是按钮将停留在形式的中间,附近的领域,如调整窗口大小

你可能不介意这一点,但它让我很烦恼。我更愿意使用复合布局逼近,将内容放置在单独的面板中,将按钮放在另一个面板中。这意味着我可以使用三种布局管理器,而不仅仅是一个力量...

​​

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FormLayout { 

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

    public FormLayout() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException 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 BorderLayout()); 

      JPanel content = new JPanel(new GridBagLayout()); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.insets = new Insets(8, 8, 8, 8); 
      gbc.anchor = GridBagConstraints.EAST; 

      content.add(new JLabel("Label 1"), gbc); 
      gbc.gridy++; 
      content.add(new JLabel("Label 2"), gbc); 

      gbc.anchor = GridBagConstraints.WEST; 
      gbc.gridy = 0; 
      gbc.gridx++; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      content.add(new JTextField(20), gbc); 
      gbc.gridy++; 
      content.add(new JTextField(20), gbc); 

      JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));  
      buttons.add(new JButton("Save")); 
      buttons.add(new JButton("Close")); 

      add(content); 
      add(buttons, BorderLayout.SOUTH); 
     }    
    }   
} 

的选择不过是自己的...

3

使用嵌套面板。例如:

JPanel springPanel = new JPanel(...); 
springPanel.add(...); 

JPanel center = new JPanel(new GridBagLayout()); 
center.add(springPanel, new GridBagConstraints()); 

frame.add(center);