2013-06-20 31 views
6

tôi phải làm điều này cho nhà trường:Làm thế nào tôi có thể làm cho một khoảng thành phần nhiều ô trong một GridBagLayout

GUI

Đây là mã tôi có cho đến nay:

import javax.swing.*; 
import java.awt.*; 

public class AddressBookGui1 extends JFrame { 
public AddressBookGui1(){ 

    GridBagLayout gbl = new GridBagLayout(); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    setLayout(gbl); 

    JLabel label; 
    JButton button; 
    JTextField textField; 
    JTextArea textArea = new JTextArea(10, 20); 

    gbc.weightx = 1; 
    label = new JLabel("text"); 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    add(label ,gbc); 

    textField = new JTextField(); 
    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 1; 
    gbc.gridy = 0; 
    add(textField ,gbc); 

    label = new JLabel("text"); 
    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 0; 
    gbc.gridy = 1; 
    gbc.gridwidth = 1; 
    add(label ,gbc); 

    textField = new JTextField(); 
    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 1; 
    gbc.gridy = 1; 
    gbc.gridwidth = 2; 
    add(textField, gbc); 

    label = new JLabel("text"); 
    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 0; 
    gbc.gridy = 2; 
    gbc.gridwidth = 1; 
    add(label ,gbc); 

    textField = new JTextField(); 
    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 1; 
    gbc.gridy = 2; 
    gbc.gridwidth = 2; 
    add(textField, gbc); 

    label = new JLabel("text"); 
    gbc.weightx = 1; 
    gbc.anchor = GridBagConstraints.FIRST_LINE_START; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 0; 
    gbc.gridy = 3; 
    gbc.gridwidth = 1; 
    add(label ,gbc); 



    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.anchor = GridBagConstraints.CENTER; 
    gbc.gridwidth = 2; 
    gbc.gridx = 1; 
    gbc.gridy = 3; 

    add(textArea, gbc); 

    gbc.weightx = 1; 
    button = new JButton("text"); 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridwidth = 1; 
    gbc.gridx = 0; 
    gbc.gridy = 4; 
    add(button ,gbc); 

    gbc.weightx = 1; 
    button = new JButton("text"); 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 3; 
    gbc.gridy = 4; 
    add(button ,gbc); 



} 
public static void main(String[] args){ 
    AddressBookGui1 frame = new AddressBookGui1(); 
    frame.setTitle("Address Book"); 
    frame.setSize(400, 300); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 

} 

This is the result

(Tôi vẫn cần phải đối phó với padding và insets. Tôi đã nhận những người làm việc trong một chương trình đơn giản hơn nhiều vì vậy tôi nghĩ rằng tôi có một xử lý về công cụ đó)

Tôi đã thử hướng dẫn về GridBagLayout Oracle và tôi không chắc mình đang làm gì sai. Ai đó có thể giúp tôi làm cho nó trông giống như nó được cho là? Cụ thể là làm cho các trường văn bản và vùng văn bản trải rộng trên 2 ô.

+0

'Cụ thể để làm cho trường văn bản và vùng văn bản trải rộng trên 2 ô' - Tại sao sau đó phải kéo dài hai ô? Trong ảnh của bạn, bạn có 2 cột và 5 hàng. Điều duy nhất bạn cần thay đổi là làm cho nút phù hợp. Cho rằng tôi đoán bạn sẽ cần phải chơi với neo. Xem lại hướng dẫn. – camickr

+0

Tôi có 3 cột. Nút cuối cùng nằm trong cột 3. –

+0

[Đây là lưới tôi đang tìm kiếm] (http://i.imgur.com/RXuoawF.png) –

Trả lời

8

Rất ít điều tôi nhận thấy về mã của bạn.

  • Không sử dụng setSize() của JFrame. Điều này sẽ gây ra hành vi bất thường. Thay vào đó, hãy tự kích thước khung hình theo kích thước của các thành phần của nó. Nếu bạn muốn khung lớn hơn, điều chỉnh không phải kích thước của khung nhưng các thành phần bên trong khung. Bạn có thể hoặc là setpreferredSize hoặc ghi đè getpreferredsize của thành phần nếu bạn thực sự muốn điều chỉnh là kích thước vì GridBagLayout là một trong những trình quản lý bố cục tôn trọng preferenceSize của thành phần. Sử dụng pack() để xóa không gian không cần thiết.

  • Không mở rộng JFrame, làm cho lớp UI của bạn có bảng chính và thêm tất cả các thành phần tại đó. cung cấp một getter cho bảng điều khiển đó (ví dụ: getUI()) để trích xuất giao diện người dùng của lớp đó.

  • Luôn khôi phục đối tượng GridBagConstraints bất cứ khi nào nó là sẽ được áp dụng cho thành phần khác. Bằng cách này, bạn có thể đọc được nhiều hơn .

  • Sử dụng miếng đệm để đặt đệm xung quanh thành phần.

  • Không sử dụng lại cùng một tham chiếu đến các thành phần khác nhau;

  • Sử dụng Initial Thread

  • Đây không phải là tiêu chuẩn nhưng nó tôi thấy nó thực sự hữu ích khi làm việc với GridBagLayout, trong thiết lập các hạn chế của GBC, làm cho nó trong thứ tự chữ cái.

Để giải quyết vấn đề của bạn, đây là mã đã sửa đổi với những điều tôi đã chỉ ra về áp dụng.

public class AddressBook { 

    private JPanel pnlMain; 

    public AddressBook() { 
     pnlMain = new JPanel(); 
     pnlMain.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 

     JLabel lblName = new JLabel("Name"); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.insets = new Insets(0, 10, 0, 0); 
     gbc.weightx = 1; 
     pnlMain.add(lblName, gbc); 

     JTextField txtName = new JTextField(); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 3; 
     gbc.gridx = 1; 
     gbc.gridy = 0; 
     gbc.insets = new Insets(5, 0, 0, 10); 
     gbc.weightx = 1; 
     pnlMain.add(txtName, gbc); 

     JLabel lblPhone = new JLabel("Phone"); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 1; 
     gbc.gridx = 0; 
     gbc.gridy = 1; 
     gbc.insets = new Insets(0, 10, 0, 0); 
     gbc.weightx = 1; 
     pnlMain.add(lblPhone, gbc); 

     JTextField txtPhone = new JTextField(); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 3; 
     gbc.gridx = 1; 
     gbc.gridy = 1; 
     gbc.insets = new Insets(5, 0, 0, 10); 
     gbc.weightx = 1; 
     pnlMain.add(txtPhone, gbc); 

     JLabel lblEmail = new JLabel("Email"); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 1; 
     gbc.gridx = 0; 
     gbc.gridy = 2; 
     gbc.insets = new Insets(0, 10, 0, 0); 
     gbc.weightx = 1; 
     pnlMain.add(lblEmail, gbc); 

     JTextField txtEmail = new JTextField(); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 3; 
     gbc.gridx = 1; 
     gbc.gridy = 2; 
     gbc.weightx = 1; 
     gbc.insets = new Insets(5, 0, 0, 10); 
     pnlMain.add(txtEmail, gbc); 

     JLabel lblAddress = new JLabel("Address"); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 1; 
     gbc.gridx = 0; 
     gbc.gridy = 3; 
     gbc.insets = new Insets(0, 10, 0, 0); 
     gbc.weightx = 1; 
     pnlMain.add(lblAddress, gbc); 

     JTextArea txtAreaAddress = new JTextArea(10, 20); 
     JScrollPane pane = new JScrollPane(txtAreaAddress); 
     gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.NORTH; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.gridwidth = 3; 
     gbc.gridx = 1; 
     gbc.gridy = 3; 
     gbc.insets = new Insets(5, 0, 0, 10); 
     gbc.weightx = 1; 
     pnlMain.add(pane, gbc); 

     JButton btnSave = new JButton("Save"); 
     gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.WEST; 
     gbc.fill = GridBagConstraints.NONE; 
     gbc.gridwidth = 1; 
     gbc.gridx = 0; 
     gbc.gridy = 4; 
     gbc.insets = new Insets(10, 10, 10, 0); 
     gbc.weightx = 1; 
     pnlMain.add(btnSave, gbc); 

     JButton btnCancel = new JButton("Cancel"); 
     gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.EAST; 
     gbc.gridwidth = 1; 
     gbc.gridx = 3; 
     gbc.gridy = 4; 
     gbc.insets = new Insets(10, 0, 10, 10); 
     gbc.weightx = 1; 
     pnlMain.add(btnCancel, gbc); 

    } 

    public JPanel getUI(){ 
     return pnlMain; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame("Address Book"); 
       frame.getContentPane().add(new AddressBook().getUI()); 
       frame.setLocationRelativeTo(null); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
3

gbc.gridwidth là thông số cho phép thành phần trải rộng trên nhiều cột. Ví dụ: nếu bạn có 3 cột và 4 hàng và bạn muốn một nhãn để chiếm toàn bộ hàng trên cùng, thì bạn cần gán ô đầu tiên cho nhãn. và đặt gbc.gridwidth = 3;