2014-02-13 46 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);