2015-10-04 13 views
5

Tôi đã thực hiện một đơn giản GridBagLayout có thêm các nút trong các ô (0,0), (1,0) và (0,1).GridBagLayout có yêu cầu các bảng giữ chỗ cho các ô trống không?

JPanel panelMain = new JPanel(new GridBagLayout()); 
GridBagConstraints c = new GridBagConstraints(); 
    c.gridx = 0; 
    c.gridy = 0; 
    panelMain.add(new JButton("0,0"),c); 

    c.gridx = 1; 
    c.gridy = 0; 
    panelMain.add(new JButton("1,0"),c); 

    c.gridx = 0; 
    c.gridy = 1; 
    panelMain.add(new JButton("0,1"),c); 

Tôi đã vui mừng khi thấy giao diện người dùng kết quả:

Desired result

Tôi muốn thêm một JButton trong một tế bào mà không được kết nối với các tế bào đang tồn tại. Tôi muốn nó được tách ra bởi một không gian trống rỗng. Khi tôi thử điều này, JButton mới được gộp lại bên cạnh những người khác. Đây là sự bổ sung:

JPanel panelMain = new JPanel(new GridBagLayout()); 
GridBagConstraints c = new GridBagConstraints(); 
    c.gridx = 0; 
    c.gridy = 0; 
    panelMain.add(new JButton("0,0"),c); 

    c.gridx = 1; 
    c.gridy = 0; 
    panelMain.add(new JButton("1,0"),c); 

    c.gridx = 0; 
    c.gridy = 1; 
    panelMain.add(new JButton("0,1"),c); 

    c.gridx = 3; 
    c.gridy = 0; 
    panelMain.add(new JButton("3,0"),c); 

Sản lượng:

Undesired result

Các JButton("3,0") được hiển thị ở các tế bào (2,0). Tôi có cần phải sử dụng một số trống JPanel làm người giữ chỗ trong ô (2.0) không? Quan trọng hơn, tại sao điều này lại xảy ra?

Trả lời

3

Bố cục không biết chiều rộng sẽ được để lại ở 2,0 trừ khi có một thành phần được đặt trong gridx = 2. Khi bạn hoàn thành giao diện người dùng, nếu bất kỳ thành phần nào được đặt, nó sẽ ổn. Đối với ví dụ .:

enter image description here

Trong trường hợp khác, bạn có thể thêm trống JPanel với kết hợp màu nền để màu nền của container.

2

Tôi có cần sử dụng JPanel trống làm người giữ chỗ trong ô (2.0) không?

Bạn có thể sử dụng hạn chế túi lưới "insets" để cung cấp khoảng trắng giữa các thành phần. Đọc hướng dẫn Swing trên How to Use GridBagLayout để biết thêm thông tin về ràng buộc inset.

Hoặc, nếu bạn muốn có một người giữ chỗ, bạn có thể sử dụng Box.createHorizontalStrut(...) để dễ dàng chỉ định chiều rộng.

Quan trọng hơn, tại sao điều này lại xảy ra?

Ô không có kích thước trừ khi có thành phần trong ô. Mỗi tế bào là độc lập với nhau vì vậy kích thước bạn mong đợi tế bào (2,0) được?

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