2012-10-09 39 views
5

Tôi cố gắng để triển khai mô hình này sử dụng bố trí GRIDBAG trong javaĐiều chỉnh Gridbag bố trí

public static void addComponentsToPane(Container pane) { 
     if (RIGHT_TO_LEFT) { 
      pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
     } 

     JLabel label1,label2,label3,result,title; 
     JButton calculate_btn; 
     JTextField side1,side2,side3; 

    pane.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    if (shouldFill) { 
    //natural height, maximum width 
    c.fill = GridBagConstraints.HORIZONTAL; 
    } 


     title = new JLabel("Area of Triangle"); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 2; 
    c.gridy = -1; 
    pane.add(title, c); 



    label1 = new JLabel("Side 1: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 1; 
    c.gridy = 1; 
    pane.add(label1, c); 

     label2 = new JLabel("Side 2: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 1; 
    c.gridy = 2; 
    pane.add(label2, c); 


     label3 = new JLabel("Side 3: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 1; 
    c.gridy = 3; 
    pane.add(label3, c); 

     side1 = new JTextField(" "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 1; 
    pane.add(side1, c); 

     side2 = new JTextField("Side 3: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 2; 
    pane.add(side2, c); 

     side3 = new JTextField("Side 3: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 3; 
    pane.add(side3, c); 

    calculate_btn = new JButton("Calculate"); 
    //c.fill = GridBagConstraints.HORIZONTAL; 
    c.ipady = 30;  //make this component tall 
    c.weightx = 0.5; 
    c.gridwidth = 3; 
    c.gridx = 0; 
    c.gridy = 5; 
    pane.add(calculate_btn, c); 

     result = new JLabel("Result displayed here"); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 7; 
    pane.add(result, c); 


    } 

Vì vậy, các mã trên là về cơ bản chỉ là thành phần mà sẽ được thêm vào một giao diện, nhưng tôi không hoàn toàn nhận được những gì tôi muốn, đây là những gì tôi đang cố gắng để đạt được

enter image description here

Nhưng đây là những gì tôi nhận được với các mã trên

enter image description here

Vì vậy, khi tôi biên dịch trên là những gì tôi endup với, còn nếu có thể, tôi không muốn người dùng thay đổi kích thước cửa sổ, tôi đoán một số boolean với một trong các tính chất cửa sổ ..

+0

'pane.setComponentOrientation (ComponentOrientation.RIGHT_TO_LEFT);' dòng mã này là bởi 'Darryl Burke' hoặc' camickr', đặc biệt là thứ hai của Swing Gurus đã đề cập một vài ví dụ về GBC trên diễn đàn này, – mKorbel

+0

GBC chỉ hoạt động (chính xác) trong trường hợp tất cả các cột được điền (sử dụng JComponents vô hình), sau đó bạn có thể sử dụng bất kỳ cột nào cho bất kỳ hàng nào :-), – mKorbel

+0

+1 có một đi trong tay đặt ra 'GridBagLayout' – MadProgrammer

Trả lời

3

Vấn đề là bạn đang thiết lập ipady mà "kéo dài" thành phần của bạn theo chiều dọc. Bạn có thể tìm cho insets tài sản: http://docs.oracle.com/javase/7/docs/api/java/awt/GridBagConstraints.html#insets

Hãy thử sử dụng này:

c.insets = new Insets(10, 0, 10, 0); 
+0

Vâng, đúng vậy. – Zarkonnen

+0

điều gì về kích thước mặc định khi chương trình khởi tạo? nó sắp ra rất nhỏ Tôi muốn cái này cố định. – noobprogrammer

+0

Ngoài ra TITLE của ứng dụng làm thế nào để đẩy nó đến tất cả các cách để đầu trang? – noobprogrammer

2

Một vấn đề tôi đang xem mã của bạn là bạn đang sử dụng lại cùng một đối tượng GridBagConstraints cho tất cả các phần tử bạn thêm vào, điều này không được khuyến khích.

Lời khuyên của tôi sẽ là sử dụng trình tạo GUI như những công cụ sẵn có trong NetBeans hoặc Eclipse. Các GUI mã hóa bằng tay trong Java rất đau đớn và đặc biệt GridBagLayout được thiết kế khá nhiều để sử dụng trong mã bố cục được tạo ra.

Cách khác, sử dụng một cái gì đó như TableLayout - hoặc cắn viên đạn và read up về sự phức tạp của GridBagConstraints.

+3

Việc tái sử dụng cùng một GBC không phải là một vấn đề. Nó có thể trông xấu xí, nhưng đó không phải là vấn đề ở đây. –

3

Đây là một cách tiếp cận sử dụng một GridBagLayout mà kết quả trong ...

enter image description here enter image description here

public class TestLayout { 

    public static void main(String[] args) { 

     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(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new FormPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    protected static class FormPane extends JPanel { 

     JLabel label1, label2, label3, result, title; 
     JButton calculate_btn; 
     JTextField side1, side2, side3; 

     public FormPane() { 
      // You may not need this, I needed it because the window packed to 
      // small on my mac ;)    
      setBorder(new EmptyBorder(4, 4, 4, 4)); 

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

      title = new JLabel("Area of Triangle"); 
      label1 = new JLabel("Side 1: "); 
      label2 = new JLabel("Side 2: "); 
      label3 = new JLabel("Side 3: "); 
      side1 = new JTextField(4); 
      side2 = new JTextField(4); 
      side3 = new JTextField(4); 
      calculate_btn = new JButton("Calculate"); 

      result = new JLabel("Result displayed here"); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.anchor = GridBagConstraints.NORTH; 
      gbc.gridwidth = 2; 
      gbc.weighty = 1; 
      add(title, gbc); 

      gbc.weighty = 0; 
      gbc.gridy = 1; 
      gbc.anchor = GridBagConstraints.WEST; 
      gbc.gridwidth = 1; 
      add(label1, gbc); 
      gbc.gridy++; 
      add(label2, gbc); 
      gbc.gridy++; 
      add(label3, gbc); 

      gbc.gridy = 1; 
      gbc.gridx = 1; 
      add(side1, gbc); 
      gbc.gridy++; 
      add(side2, gbc); 
      gbc.gridy++; 
      add(side3, gbc); 

      gbc.gridx = 0; 
      gbc.gridwidth = 2; 
      gbc.gridy++; 
      add(result, gbc); 

      gbc.gridy++; 
      gbc.weighty = 1; 
      gbc.anchor = GridBagConstraints.NORTH; 
      add(calculate_btn, gbc); 

     } 

    } 

} 

Nếu bạn muốn thêm khoảng cách giữa tiêu đề và các trường một d một số Insets

gbc.insets = new Insets(0, 0, 8, 0); 
add(title, gbc); 

// Don't forget to reset them ;) 
gbc.insets = new Insets(0, 0, 0, 0); 

Tôi vừa nhận ra rằng kết quả sẽ được hiển thị dưới nút. Hoán đổi đơn giản các dòng add(result, gbc)add(calculate_btn, gbc), mọi thứ phải giữ nguyên như nhau

+0

XUẤT SẮC là có cách nào để thiết lập kích thước cho JFrame và khóa nó với kích thước – noobprogrammer

+0

? JFrame.setSize, hãy cẩn thận, mặc dù làm việc của bạn trong một môi trường thay đổi, nơi mà các cỡ chữ, Sở KH & ĐT và độ phân giải không bao giờ giống nhau, tốt hơn để sử dụng gói để cho phép các khung để điều chỉnh kích thước ưa thích của nội dung của nó. tôi có xu hướng thêm một học sinh nội trú rỗng với nhiều khung hình của tôi để cung cấp cho nó một số không gian xung quanh nội dung. để ngăn chặn người dùng từ thay đổi kích thước khung hình, sử dụng JFrame.setResizable – MadProgrammer

Các vấn đề liên quan