2011-10-10 25 views
6

Tôi đang cố gắng thiết kế một nút JButton (nút "Ok") để nhìn tốt phải nằm ngang trong JFrame chứa.
Tôi đang sử dụng Trình tạo GUI với bố cục Biểu mẫu tự do (GroupLayout).
NetBeans, GUI builder (bố trí nhóm) định tâm một thành phần

Tôi đã thực hiện một số hướng dẫn về trình tạo GUI (http://netbeans.org/kb/docs/java/quickstart-gui.html) nhưng chưa tìm thấy chủ đề này. Trong các nhà xây dựng gui khác (delphi) điều này có thể được thực hiện bằng cách loại bỏ các neo từ cả hai cạnh.

Trả lời

5

Nếu bạn muốn thành phần của bạn vẫn được căn giữa trong vùng chứa nếu vùng chứa được thay đổi kích thước, bạn có một số tùy chọn cho bạn, nhưng tôi không nghĩ GroupLayout là một trong số chúng (vui lòng sửa tôi nếu tôi sai rồi). Một cách là thay đổi bố cục của container thành GridBagLayout, và sau đó chỉ cần thêm JButton vào nó mà không có bất kỳ ràng buộc nào.

+1

trường hợp (i nghĩ rằng đó là rất thường xuyên) là bạn có một hình thức với nhiều điều khiển. Cách bố trí các điều khiển làm cho GroupLayout trở thành một lựa chọn hoàn hảo. Ngoại trừ nút ở cuối, cần phải căn giữa. Tất nhiên tôi có thể đặt một JPanel ở cuối trang, làm cho nó có thể thay đổi kích thước theo chiều ngang và đưa vào (mặc định) trung tâm của nó FlowLayout JButton. Nhưng câu hỏi phát sinh từ thực tế là trong các nhà xây dựng GUI khác (không quá phức tạp) như của Delphi, việc định tâm là một phần mở rộng birllant của logic neo đậu. Không neo một điều khiển đến bất cứ nơi nào có nghĩa là để cho nó "nổi" ở trung tâm. – AgostinoX

+0

@AgostinoX bạn sẽ có rất nhiều bất ngờ với 'LayoutManager' này Pete +1 – mKorbel

+0

@mKorbel, tôi không vui khi nghe điều đó :-). bạn có thể cung cấp một vài mẫu không? – AgostinoX

2

Thử LayoutManager! GroupLayout rất tối nghĩa khi chỉ xem mã được tạo bởi NetBeans.

Nếu bạn sử dụng DesignGridLayout sau đó những gì bạn cần là đơn giản như:

DesignGridLayout layout = new DesignGridLayout(container); 
layout.row().center().add(okButton); 
+0

@ jfpoilpret: nó có cung cấp một người xây dựng gui không? – AgostinoX

+0

Không cần một trình xây dựng GUI khi sử dụng designGridLayout, đó là sức mạnh của nó! Mã bạn viết trực tiếp thể hiện bố cục bạn muốn. Và chỉ đọc mã cho bạn một tầm nhìn ngay lập tức của bố trí thu được. Không có trình xây dựng GUI, không tạo mã xấu hoặc phức tạp, giúp bảo trì rất nhiều, ngoài việc giảm bớt mã hóa ban đầu. API DesignGridLayout rất dễ dàng, bạn có thể hiểu cách sử dụng và tạo bố cục của riêng mình sau một hoặc hai giờ đọc phần giới thiệu và các ví dụ trên trang web. – jfpoilpret

1

javax.swing.Box.Filler có thể được sử dụng để gian pad quanh một thành phần bên trong một GroupLayout. Trong NetBeans Matisse (GUI Builder) chúng được gọi là 'Horizontal Strut' dưới phần 'Swing Fillers' của bảng màu. Chỉ cần đặt một ở hai bên của nút của bạn, kích thước chúng để lấp đầy tất cả khoảng trống giữa nút và cạnh của vùng chứa và đảm bảo cả hai được gắn cờ để Tự động thay đổi kích thước theo chiều ngang.

Đối với việc sử dụng một Trình quản lý bố cục khác, tôi biết mọi người không thích GroupLayout vì nó không có lợi cho việc mã hóa thủ công. Đó là do thiết kế. Khi docs nói, GroupLayout được dự định sẽ được sử dụng bởi các nhà xây dựng GUI. Vì vậy, miễn là bạn đang ok với buộc mình để sử dụng NetBeans & Matisse cho cuộc sống của GUI của bạn, GroupLayout thực sự là lựa chọn tốt nhất.

3

GroupLayout không hỗ trợ định tâm các thành phần. Trình quản lý bố cục rất có khả năng. Cá nhân tôi đặt nó sau người quản lý MigLayout và trước người quản lý FormLayout.

Trong ba ví dụ sau, chúng tôi có một bảng điều khiển và một nút. Nút được đặt ở giữa theo chiều ngang.

Định tâm với NetBeans Builder

Để đặt một thành phần sử dụng Netbeans Builder, chúng ta cần tạo ngang resizable khoảng cách từ hai phía của nút.

Diện tích màu xanh lá cây của ảnh chụp màn hình là khoảng trống hiện được chọn. Các chuỗi bên trong khoảng trống cho thấy rằng đó là một khoảng cách thay đổi kích thước.

NetBeans screenshot

Các khoảng trống sẽ được tự động thêm vào khi chúng ta đặt các thành phần trên biểu mẫu. Để xác định khoảng cách có thể thay đổi kích thước, chúng tôi nhấp chuột phải vào khoảng trống và chọn tùy chọn "Chỉnh sửa bố cục". Chúng tôi nhận được hộp thoại sau:

NetBeans screenshot

Để có được một khoảng cách thay đổi kích thước, chúng tôi kiểm tra hộp kiểm Resizable.

Định tâm bằng tay bằng cách sử dụng một nhóm song song

Linh kiện có thể được tập trung trong nhóm song song bằng cách thông qua các tham số GroupLayout.Alignment.CENTER.

package com.zetcode; 

import java.awt.Container; 
import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.GroupLayout; 
import static javax.swing.GroupLayout.Alignment.CENTER; 
import static javax.swing.GroupLayout.DEFAULT_SIZE; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GroupLayoutCenter extends JFrame { 

    public GroupLayoutCenter() { 

     initUI(); 

     setTitle("Centered button"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null);   
    } 

    private void initUI() { 

     Container pane = getContentPane(); 
     GroupLayout gl = new GroupLayout(pane); 
     pane.setLayout(gl);  

     gl.setAutoCreateGaps(true); 
     gl.setAutoCreateContainerGaps(true); 

     JPanel pnl = new JPanel(); 
     pnl.setBorder(BorderFactory.createEtchedBorder()); 

     JButton btn = new JButton("Button"); 

     gl.setHorizontalGroup(gl.createParallelGroup(CENTER) 
      .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE) 
      .addComponent(btn) 
     ); 

     gl.setVerticalGroup(gl.createSequentialGroup() 
      .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE) 
      .addComponent(btn)    
     );   

     pack(); 
    } 


    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       GroupLayoutCenter ex = new GroupLayoutCenter(); 
       ex.setVisible(true); 
      } 
     }); 
    } 
} 

Định tâm bằng tay bằng cách sử dụng những khoảng trống

Giải pháp này là những gì NetBeans tạo ra mã lệnh thực hiện. Chúng tôi đặt hai khoảng trống có thể thay đổi kích thước ở bên trái và bên phải của nút.

package com.zetcode; 

import java.awt.Container; 
import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.GroupLayout; 
import static javax.swing.GroupLayout.DEFAULT_SIZE; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GroupLayoutCenter2 extends JFrame { 

    public GroupLayoutCenter2() { 

     initUI(); 

     setTitle("Centered button"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null);   
    } 

    private void initUI() { 

     Container pane = getContentPane(); 
     GroupLayout gl = new GroupLayout(pane); 
     pane.setLayout(gl);  

     gl.setAutoCreateGaps(true); 
     gl.setAutoCreateContainerGaps(true); 

     JPanel pnl = new JPanel(); 
     pnl.setBorder(BorderFactory.createEtchedBorder()); 

     JButton btn = new JButton("Button"); 

     gl.setHorizontalGroup(gl.createParallelGroup() 
       .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE) 
       .addGroup(gl.createSequentialGroup() 
         .addGap(5, 100, Short.MAX_VALUE) 
         .addComponent(btn) 
         .addGap(5, 100, Short.MAX_VALUE)) 
     ); 

     gl.setVerticalGroup(gl.createSequentialGroup() 
       .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE) 
       .addComponent(btn) 
     );  

     pack(); 
    } 


    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       GroupLayoutCenter2 ex = new GroupLayoutCenter2(); 
       ex.setVisible(true); 
      } 
     }); 
    } 
} 

enter image description here

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