2009-08-14 38 views
12

vấn đề nằm ở bố trí trung tâm của các thành phần, GridBagLayout luôn luôn 'ngồi' ở trung tâm của JPanel, vì vậy tôi không quan tâm nó sẽ bố trí các thành phần bên trong như thế nào, vấn đề của tôi là nơi các thành phần này sẽ bắt đầu đặt trên bảng điều khiển.Làm thế nào để đẩy GridbagLayout không đặt các thành phần ở trung tâm của JPanel

Tôi đã thử với:

panel.setAlignmentX(JPanel.LEFT_ALIGNMENT); 

nhưng nó đã không giúp đỡ.

Bất kỳ ý tưởng nào?

Trả lời

19

Bạn cần thêm ít nhất một thành phần sẽ lấp đầy khoảng trống ngang. Nếu bạn không có một thành phần như vậy, bạn có thể thử này:

GridBagConstraints noFill = new GridBagConstraints(); 
noFill.anchor = GridBagConstraints.WEST; 
noFill.fill = GridBagConstraints.NONE; 

GridBagConstraints horizontalFill = new GridBagConstraints(); 
horizontalFill.anchor = GridBagConstraints.WEST; 
horizontalFill.fill = GridBagConstraints.HORIZONTAL;  

panel.add(new JLabel("Left Aligned"), noFill); 
panel.add(Box.createHorizontalGlue(), horizontalFill); 
0

Nếu bạn muốn thay đổi nơi một thành phần nằm trong một tế bào được tạo ra bởi một GridBagLayout sử dụng tham số anchor từ GridBagConstraints.

+0

Điều đó là không đủ, bạn phải có một thành phần lấp đầy không gian ngang còn lại. –

+0

vâng tôi biết điều đó; đó không phải là câu hỏi, vấn đề là trong việc đặt toàn bộ 'lưới' này ở góc trên bên trái của JPanel đang giữ các yếu tố, không can thiệp vào công việc nội thất của GridBags trong việc bố trí các thành phần. Chỉ cần nói GridBag: ok, anh chàng, bạn làm công việc của bạn như bạn muốn, chỉ cần ngồi trên góc trên bên trái thay vì ngồi ở trung tâm –

+1

@as: Bombe là đúng mà bạn cần phải sử dụng GridBagConstraints.anchor, chỉ cần bỏ lỡ chút về thành phần lấp đầy. Tôi tin rằng tôi đúng khi nói GridBagLayout không tôn trọng JComponent.setAlignmentX và JComponent.setAlignmentY, cả hai đều áp dụng cho chính thành phần đó chứ không phải nội dung của vùng chứa. –

0

Tôi gặp vấn đề tương tự như bạn. Giải quyết nó bằng cách thêm Panel đó vào một cái khác với ràng buộc BorderLayout và NORTH.

Ondrej

0

Bạn có thể thực hiện việc này chỉ đơn giản bằng cách sử dụng tiện ích này painless-gridbag. Nó cũng làm cho mã của bạn với GridBagLayout đẹp hơn nhiều, như sau

PainlessGridBag gbl = new PainlessGridBag(getContentPane(), false); 

    gbl.row().cell(lblFirstName).cell(txtFirstName).fillX() 
      .cell(lblFamilyName).cell(txtFamilyName).fillX(); 
    gbl.row().cell(lblAddress).cellXRemainder(txtAddress).fillX(); 

    gbl.doneAndPushEverythingToTop(); 
+0

-1 Thay thế một cơn đau khác. Việc học GridBagLayout hữu ích hơn rất nhiều. –

8

Trong Ngoài việc thiết lập các lĩnh vực anchorfill, bạn có thể sẽ cần phải thiết lập các lĩnh vực weightx. Điều này giúp xác định hành vi thay đổi kích thước.

Quote:

Trừ khi bạn chỉ định ít nhất một khác không xứng với weightx hoặc nặng, tất cả các thành phần lại với nhau ở trung tâm của container của họ. Điều này là do khi trọng lượng là 0,0 (mặc định), GridBagLayout đặt thêm bất kỳ khoảng trống nào giữa lưới ô của nó và các cạnh của vùng chứa.

Sau đây sẽ giữ myComponent được neo vào góc NORTHWEST. Giả sử thisJPanel hoặc tương tự:

setLayout(new GridBagLayout()); 
GridBagConstraints c = new GridBagConstraints(); 

// Specify horizontal fill, with top-left corner anchoring 
c.fill = GridBagConstraints.HORIZONTAL; 
c.anchor = GridBagConstraints.NORTHWEST; 

// Select x- and y-direction weight. Without a non-zero weight, 
// the component will still be centered in the given direction. 
c.weightx = 1; 
c.weighty = 1; 

// Add child component 
add(myComponent, c); 

Để giữ cho các thành phần con canh trái nhưng theo chiều dọc làm trung tâm, chỉ cần đặt anchor = WEST và loại bỏ weighty = 1;.

0

Bạn có thể đặt bố cục chính làm flowlayout và đặt căn chỉnh ở bên trái. trong bảng điều khiển này (flowlayout), thêm một bảng điều khiển là gridbaglayout. cũng được làm việc trong netbeans

0

Một giải pháp khác là bạn thêm hai bảng điều khiển giả (vùng chứa) vào bên phải, dưới cùng. sau đó bạn điều chỉnh weightx và weighty để phân phối thêm không gian. nếu bạn đặt 1 cho giả thì tất cả không gian thừa sẽ được gán cho giả này.

đây là ví dụ tạo thành trong netbeans.

package tutorial; 

/** 
* 
* @author ttn 
*/ 
public class GridBag1 extends javax.swing.JPanel { 

    /** 
    * Creates new form GridBag1 
    */ 
    public GridBag1() { 
     initComponents(); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 
     java.awt.GridBagConstraints gridBagConstraints; 

     jLabel1 = new javax.swing.JLabel(); 
     jTextField1 = new javax.swing.JTextField(); 
     jPanel1 = new javax.swing.JPanel(); 
     jPanel2 = new javax.swing.JPanel(); 
     jLabel2 = new javax.swing.JLabel(); 
     jTextField2 = new javax.swing.JTextField(); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTextArea1 = new javax.swing.JTextArea(); 

     setLayout(new java.awt.GridBagLayout()); 

     jLabel1.setText("jLabel1"); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 0; 
     add(jLabel1, gridBagConstraints); 

     jTextField1.setText("jTextField1"); 
     jTextField1.setMinimumSize(new java.awt.Dimension(59, 20)); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 1; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 
     gridBagConstraints.weightx = 0.3; 
     add(jTextField1, gridBagConstraints); 

     javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
     jPanel1.setLayout(jPanel1Layout); 
     jPanel1Layout.setHorizontalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 227, Short.MAX_VALUE) 
     ); 
     jPanel1Layout.setVerticalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 104, Short.MAX_VALUE) 
     ); 

     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 2; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.gridheight = 3; 
     gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 
     gridBagConstraints.weightx = 1.0; 
     add(jPanel1, gridBagConstraints); 

     javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); 
     jPanel2.setLayout(jPanel2Layout); 
     jPanel2Layout.setHorizontalGroup(
      jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 172, Short.MAX_VALUE) 
     ); 
     jPanel2Layout.setVerticalGroup(
      jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 196, Short.MAX_VALUE) 
     ); 

     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 3; 
     gridBagConstraints.gridwidth = 2; 
     gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 
     gridBagConstraints.weighty = 1.0; 
     add(jPanel2, gridBagConstraints); 

     jLabel2.setText("jLabel2"); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 1; 
     add(jLabel2, gridBagConstraints); 

     jTextField2.setText("jTextField2"); 
     jTextField2.setMinimumSize(new java.awt.Dimension(59, 20)); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 1; 
     gridBagConstraints.gridy = 1; 
     gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 
     gridBagConstraints.weightx = 0.3; 
     add(jTextField2, gridBagConstraints); 

     jScrollPane1.setMinimumSize(new java.awt.Dimension(104, 64)); 

     jTextArea1.setColumns(20); 
     jTextArea1.setRows(5); 
     jScrollPane1.setViewportView(jTextArea1); 

     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 2; 
     gridBagConstraints.gridwidth = 2; 
     gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START; 
     add(jScrollPane1, gridBagConstraints); 
    }// </editor-fold>       


    // Variables declaration - do not modify      
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JPanel jPanel1; 
    private javax.swing.JPanel jPanel2; 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JTextArea jTextArea1; 
    private javax.swing.JTextField jTextField1; 
    private javax.swing.JTextField jTextField2; 
    // End of variables declaration     
} 
Các vấn đề liên quan