2012-03-02 30 views
5

Tôi có một giao diện người dùng trung bình lớn sử dụng BorderLayout; trung tâm là một ngăn chứa thẻ có chứa các bảng khác nhau với các bố trí khác nhau, v.v.Giữ kích thước ưa thích của các thành phần ở giữa BorderLayout

Tôi muốn bảng ở giữa bố cục đường viền này đổi kích thước theo kích thước của cửa sổ, nhưng tôi không muốn các thành phần bên trong bảng điều khiển để kéo dài. Nhãn, hộp tổ hợp, trường văn bản, nút - Tôi muốn chúng giữ nguyên kích thước ưa thích của chúng và cho phép bảng điều khiển chứa chúng giãn ra. Tôi đặt chúng trong một khung cuộn trong trường hợp không gian quá nhỏ cho bảng điều khiển.

Các áp phích khác nhau với các từ vựng đầy màu sắc cảnh báo chống lại sự nguy hiểm của việc sử dụng bất kỳ phương thức setXXXsize() nào trên các thành phần. Đó là những gì tôi làm bây giờ, và tôi muốn tìm hiểu làm thế nào để tránh nó.

GridBagLayout không phù hợp với một số bảng của tôi. Đó là, theo bản chất, định hướng xung quanh các hàng và cột, và không phải tất cả mọi thứ phù hợp với hàng và cột. Tất nhiên tôi có thể tạo ra các hàng và cột nhân tạo để phù hợp với mọi thứ, nhưng tôi thực sự hy vọng Swing có nhiều lựa chọn bố cục hơn thế.

Keo dọc cũng không hoạt động. Tôi đã đưa nó vào SSCE yêu quý của HFOE:

package example; 

    import java.awt.BorderLayout; 

    import javax.swing.Box; 
    import javax.swing.BoxLayout; 
    import javax.swing.JComboBox; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 

    public class BorderAndBox extends JFrame 
    { 
     public static void main(String args[]) 
     { 
      BorderAndBox bnb = new BorderAndBox(); 
      bnb.createUI(); 
      bnb.setVisible(true); 
     } 

     public void createUI() 
     { 
      JPanel borderPanel = new JPanel(new BorderLayout()); 

      JLabel northLabel = new JLabel("Nawth"); 
      borderPanel.add(northLabel, BorderLayout.NORTH); 

      String[] southComboChoices = { "one", "two", "three" }; 
      JComboBox southCombo = new JComboBox(southComboChoices); 
      borderPanel.add(southCombo, BorderLayout.SOUTH); 

      JPanel centerPanel = new JPanel(); 
      centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS)); 
      String[] firstChoices = { "first", "uno", "UN" }; 
      String[] secondChoices = { "second", "dos", "zwei" }; 
      String[] thirdChoices = { "third", "tres", "drei" }; 
      JComboBox firstCombo = new JComboBox(firstChoices); 
      JComboBox secondCombo = new JComboBox(secondChoices); 
      JComboBox thirdCombo = new JComboBox(thirdChoices); 
      centerPanel.add(firstCombo); 
      centerPanel.add(secondCombo); 
      centerPanel.add(thirdCombo); 
      centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT 
      // take up available vertical space, instead it appears to create a space 
      // that is shared equally among the (now) four components of this space. 
      borderPanel.add(centerPanel, BorderLayout.CENTER); 

      getContentPane().add(borderPanel); 
      pack(); 
     } 

    } 

Nếu bạn phóng to cửa sổ, hộp combobox ở giữa sẽ mở rộng; như được viết, một mảnh keo dọc bên dưới chúng cũng phóng to, nhưng không chiếm hết không gian sẵn có. Nó xuất hiện nó được đưa ra nhiều không gian như mỗi người trong số họ.

Vậy cách tốt nhất để tiếp cận điều này là gì?

+0

* ".. SSCE yêu dấu:" * Tôi cũng thích nó. Và đó là SSCCE (2 Cs). ;) –

+0

nó không thể chỉ là một ví dụ nhỏ khép kín? – arcy

+0

* "nó không thể chỉ là một ví dụ nhỏ khép kín?" * [Trích dẫn] (http://sscce.org/#co) một trong những người tôi yêu thích: * "Trong tài liệu này, chính xác (hoặc có thể biên dịch được, đặc biệt liên quan đến mã nguồn máy tính) có nghĩa là đảm bảo rằng ví dụ của bạn phù hợp với các tiêu chuẩn và giao thức được chấp nhận. ”* Điểm phụ đáng chú ý nhất *" Đảm bảo ví dụ của bạn là chính xác. Ví dụ này biên dịch rõ ràng hoặc gây ra thông báo lỗi chính xác muốn được giúp đỡ. "* Mã được biên dịch và cho thấy sự cố, dễ thực hiện. Nó * là * một SSCCE. :) –

Trả lời

10

BorderAndBox - centered

import java.awt.BorderLayout; 
import java.awt.GridBagLayout; 

import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class BorderAndBox extends JFrame 
{ 
public static void main(String args[]) 
{ 
    BorderAndBox bnb = new BorderAndBox(); 
    bnb.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    bnb.createUI(); 
    bnb.setVisible(true); 
} 

public void createUI() 
{ 
    JPanel borderPanel = new JPanel(new BorderLayout()); 

    JLabel northLabel = new JLabel("Nawth"); 
    borderPanel.add(northLabel, BorderLayout.NORTH); 

    String[] southComboChoices = { "one", "two", "three" }; 
    JComboBox southCombo = new JComboBox(southComboChoices); 
    borderPanel.add(southCombo, BorderLayout.SOUTH); 

    JPanel centerPanel = new JPanel(); 
    centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS)); 
    String[] firstChoices = { "first", "uno", "UN" }; 
    String[] secondChoices = { "second", "dos", "zwei" }; 
    String[] thirdChoices = { "third", "tres", "drei" }; 
    JComboBox firstCombo = new JComboBox(firstChoices); 
    JComboBox secondCombo = new JComboBox(secondChoices); 
    JComboBox thirdCombo = new JComboBox(thirdChoices); 
    centerPanel.add(firstCombo); 
    centerPanel.add(secondCombo); 
    centerPanel.add(thirdCombo); 
    centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT 
    // take up available vertical space, instead it appears to create a space 
    // that is shared equally among the (now) four components of this space. 
    JPanel centerPanelConstrain = new JPanel(new GridBagLayout()); 
    centerPanelConstrain.add(centerPanel); 
    borderPanel.add(centerPanelConstrain, BorderLayout.CENTER); 

    getContentPane().add(borderPanel); 
    pack(); 
} 

} 

Xem thêm this answer. Có nhiều cách để giải quyết vấn đề này.

+0

Đó là một mẹo dễ thương; Tôi giả sử tôi có thể chơi với GridBagLayout của thành phần duy nhất của tôi để làm cho nó xuất hiện ở phía trên bên trái, như tôi muốn. Bạn có quan tâm để giải thích lý do tại sao điều này hoạt động? – arcy

+0

* "Bạn có quan tâm đến việc giải thích tại sao nó hoạt động không?"* Một thành phần đơn lẻ được thêm vào một GBL không có ràng buộc, kết thúc ở trung tâm. Như bất kỳ vị trí nào khác, tôi không chắc chắn. Tôi chỉ sử dụng GBL để định tâm các thành phần duy nhất, và một lần trước đây cho một bảng tuần hoàn (sắp xếp Mỗi phần tử) Hôm nay tôi có thể làm điều sau bằng cách sử dụng 'GroupPlayout'. Tôi không có chuyên gia về GBL. –

+0

GroupPlayout? LOL, 1 dù vậy, tôi cũng sắp đăng cùng một logic, nhưng có vẻ như tôi cũng vậy Quá muộn, –

-1

tôi sẽ khuyên bạn sử dụng JPanel với javax.swing.GroupLayout. Tuy nhiên nó không phải là dễ dàng để sử dụng bố trí này bằng cách mã hóa nó. Sử dụng các trình tạo mã như Netbeans Matisse Builder và sao chép dán nó vào bất cứ nơi nào bạn muốn nếu bạn không muốn sử dụng IDE.

+1

GroupLayout, như GridBagLayout, là tất cả về hàng và cột; Tôi có thể sử dụng GroupLayout giống như cách mà Thompson chỉ cho tôi thấy GridBagLayout, tôi sẽ xem liệu có dễ dàng hơn khi đặt ở góc trên bên trái như tôi muốn không. Nhưng tôi nghĩ rằng cả hai bố trí Group và GridBag là sự lựa chọn kém cho các bảng với một số thành phần nhưng không xuất hiện hàng/cột. – arcy

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