2013-03-10 89 views
1

我正在學習GridBagLayout,並做到了連接,有兩個我已經使用New.setPreferredSize(new Dimension(70,23));非常小的混亂
是標準的方式,使所有的按鈕大小相同JFrame組件的大小和位置

非常簡單的佈局

組件的2-配售不好看

enter image description here

現在看到有更多padding on all sides of components,所以如何把它放在正確的方式from top left corner,我應該減少的大小JFrame?或使用frame.pack();都工作,但不知道是什麼標準的做法(我曾經嘗試pagestart等),

這是我的代碼看起來

frame= new JFrame("Hello "); 
    frame.setSize(300, 150); 
    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
    frame.addWindowListener(this); 
    frame.setResizable(false); 
    frame.setLocation(0, 0); 
    p1= new JPanel (new GridBagLayout()); 

    gbc = new GridBagConstraints(); 

    lblname= new JLabel("Name"); 
    gbc.gridx=0; 
    gbc.gridy=0; 

    p1.add(lblname, gbc); 

    textname = new JTextField(11); 
    gbc.gridx=1; 
    gbc.gridy=0 ; 

    p1.add(textname, gbc); 

    New= new JButton("New"); 
    gbc.gridx=2; 
    gbc.gridy=0; 
    New.setPreferredSize(new Dimension(70,23)); 
    p1.add(New, gbc); 

    lblEmail = new JLabel("Email "); 
    gbc.gridx=0; 
    gbc.gridy=1; 
    p1.add(lblEmail , gbc); 

    TextEmail = new JTextField(11); 
    gbc.gridx=1; 
    gbc.gridy=1; 
    p1.add(TextEmail,gbc); 

    Edit = new JButton("Edit") ; 
    gbc.gridx= 2 ; 
    gbc.gridy=1; 
    Edit.setPreferredSize(new Dimension(70,23)); 

    p1.add(Edit , gbc); 

    lblgender= new JLabel("Gender"); 
    gbc.gridx=0; 
    gbc.gridy=2; 
    p1.add(lblgender, gbc); 

    TextGender= new JTextField(11); 
    gbc.gridx=1; 
    gbc.gridy=2; 
    p1.add(TextGender, gbc); 

    Gender= new JButton("Gender"); 
    gbc.gridx=2; 
    gbc.gridy=2; 
    Gender.setPreferredSize(new Dimension(70,23)); 

    p1.add(Gender, gbc); 

    pre= new JButton("<<"); 
    gbc.gridx=0; 
    gbc.gridy=3; 
    p1.add(pre, gbc); 

    count = new JTextField(5); 
    gbc.gridx=1; 
    gbc.gridy=3; 
    p1.add(count, gbc); 

    next= new JButton(">>"); 
    gbc.gridx=2; 
    gbc.gridy=3; 
    next.setPreferredSize(new Dimension(70,23)); 

    p1.add(next, gbc); 


    p1.setVisible(true); 
    frame.add(p1); 
    frame.setVisible(true); 
+0

要獲得最佳快速回復,請考慮創建併發布[sscce](http://sscce.org)。 – 2013-03-10 08:03:21

+0

@HovercraftFullOfEels喜歡你的新口號,通過安德魯湯普森的;) – Mordechai 2013-03-10 08:05:58

+2

是的,'pack()'是標準的做法。 – Mordechai 2013-03-10 08:06:48

回答

4

GridBagLayout將推動你瘋了,這也是一個最JDK中提供了靈活的佈局管理器。

不要害怕使用複合佈局。在下面的例子中,我將導航控件移動到了自己的面板,這使得定義複雜佈局變得更容易(您也可以以這種方式混合佈局管理器)

GridBagConstraints#fill允許您確定如何填充組件在那裏細胞。你有GridBagConstraints.HORIZONTAL,GridBagConstraints.VERTICALGridBagConstraints.BOTH ......我認爲那裏的含義是自我解釋。

在下面的例子中,我用GridBagConstraints.HORIZONTAL到/列允許鍵上的細胞內填補所有可用空間

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
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; 
import javax.swing.border.LineBorder; 

public class TestLayout20 { 

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

    public TestLayout20() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       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.anchor = GridBagConstraints.WEST; 
      JLabel lblname = new JLabel("Name"); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 

      add(lblname, gbc); 

      JTextField textname = new JTextField(11); 
      gbc.gridx = 1; 
      gbc.gridy = 0; 

      add(textname, gbc); 

      JLabel lblEmail = new JLabel("Email "); 
      gbc.gridx = 0; 
      gbc.gridy = 1; 
      add(lblEmail, gbc); 

      JTextField TextEmail = new JTextField(11); 
      gbc.gridx = 1; 
      gbc.gridy = 1; 
      add(TextEmail, gbc); 

      JLabel lblgender = new JLabel("Gender"); 
      gbc.gridx = 0; 
      gbc.gridy = 2; 
      add(lblgender, gbc); 

      JTextField TextGender = new JTextField(11); 
      gbc.gridx = 1; 
      gbc.gridy = 2; 
      add(TextGender, gbc); 

      JButton New = new JButton("New"); 
      gbc.fill = GridBagConstraints.HORIZONTAL; 
      gbc.insets = new Insets(0, 12, 0, 0); 
      gbc.gridx = 2; 
      gbc.gridy = 0; 
      add(New, gbc); 

      JButton edit = new JButton("Edit"); 
      gbc.gridx = 2; 
      gbc.gridy = 1; 

      add(edit, gbc); 

      JButton Gender = new JButton("Gender"); 
      gbc.gridx = 2; 
      gbc.gridy = 2; 

      add(Gender, gbc); 

      JPanel pnlNav = new JPanel(new GridBagLayout()); 
      gbc.insets = new Insets(12, 0, 0, 0); 
      gbc.gridx = 0; 
      gbc.gridy = 3; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 

      add(pnlNav, gbc); 

      JTextField count = new JTextField(5); 
      gbc = new GridBagConstraints(); 
      gbc.gridx = 1; 
      gbc.gridy = 0; 
      pnlNav.add(count, gbc); 

      JButton pre = new JButton("<<"); 
      gbc.anchor = GridBagConstraints.WEST; 
      gbc.weightx = 1; 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      pnlNav.add(pre, gbc); 

      JButton next = new JButton(">>"); 
      gbc.anchor = GridBagConstraints.EAST; 
      gbc.gridx = 2; 
      gbc.gridy = 0; 
      pnlNav.add(next, gbc); 

     } 
    } 
} 

我強烈建議你讀通過How to use GridBagLayout以獲得更好的解釋:P

+0

當然,我將不得不閱讀:)非常有幫助。非常感謝親愛的 – Sikander 2013-03-10 08:38:13