2012-01-12 32 views
7

Tôi không thể tìm ra cách để thay đổi kích thước một số thành phần trong GUI xoay. Một số nhãn tùy chỉnh đang được thêm vào FlowLayout không hoạt động như thế nào khi thay đổi kích thước hộp thoại. Bảng điều khiển đang được xây dựng bằng cách sử dụng khung biểu mẫu jgoodies.Nhận kích thước ưa thích của flowlayout nhiều dòng

Nếu sử dụng lệnh này, các FlowLayout đang được thêm vào xy (3, y)

FormLayout layout = new FormLayout("r:d, 5px, f:d:g", // columns 
      "p, p, 5px, p, 5px, p") // rows 

Các FlowLayout mở rộng và một thanh cuộn xuất hiện
tags_scroll

Nếu sử dụng

FormLayout layout = new FormLayout("r:d, 5px, f:10:g", // columns 
      "p, p, 5px, p, 5px, p") // rows 

FlowLayout sử dụng không gian có sẵn và các mục trên dòng thứ hai biến mất
tags_vanish

Tôi muốn mở rộng chiều cao của mỗi hàng có chứa FlowLayout đến chiều cao hiện tại của thành phần. Thật không may, kích thước ưa thích luôn luôn tương ứng với hight cho một hàng duy nhất.
Bố cục khác có phù hợp hơn không? Văn bản in đậm ở bên trái phải được căn phải, tiếp theo là FlowLayout.

Sources

[sửa] Sau khi cố gắng tìm ra cách để làm điều này trong nhiều tuần, câu hỏi thực tế có thể được nối lại như thế này:
Một tập hợp các nhãn đã được thêm vào một JPanel. JPanel này nên sử dụng tất cả không gian có sẵn theo chiều ngang (kích thước đối thoại trừ chiều rộng của nhãn tên thẻ) và mở rộng khi cần theo chiều dọc. Nếu chiều cao của JPanel lớn hơn thì đối thoại, một thanh cuộn dọc sẽ xuất hiện (thanh cuộn ngang không bao giờ được nhìn thấy). Cuộc đối thoại có thể hiển thị nhiều JPanels sẽ được hiển thị sau lần khác (theo chiều dọc).

Dưới đây là một nỗ lực sử dụng GridBagLayout và WrapLayout:

public class GridBagLayoutTagPanel extends JPanel { 
private static final long serialVersionUID = -441746014057882848L; 
private final int NB_TAGS = 5; 

public GridBagLayoutTagPanel() { 
    setLayout(new GridLayout()); 

    JPanel pTags = new JPanel(new GridBagLayout()); 
    pTags.setBackground(Color.ORANGE); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.ipadx = 5; 
    c.ipady = 5; 

    int rowIndex = 0; 
    for (int i = 0; i < NB_TAGS; i++) { 
     //add tag name 
     JLabel lTagName = new JLabel(String.format("Tag %s:", i)); 
     lTagName.setFont(lTagName.getFont().deriveFont(Font.BOLD)); 
     c.fill = GridBagConstraints.NONE; 
     c.gridx = 0; 
     c.gridy = rowIndex++; 
     pTags.add(lTagName, c); 

     //add tag values 
     JPanel pTag = new JPanel(new BorderLayout()); 
     pTag.add(new JLabel("+"), BorderLayout.LINE_START); //label used to add new tags 
     pTag.add(getWrapPanel(), BorderLayout.CENTER); //the list of tag values 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 1; 
     pTags.add(pTag, c); 
    } 

    //JScrollPane sp = new JScrollPane(pTags); 
    //sp.setBorder(BorderFactory.createEmptyBorder()); 

    add(pTags); 
    } 

private static JPanel getWrapPanel() { 
    JPanel p = new JPanel(new WrapLayout(FlowLayout.LEFT, 5, 0)); 

    for (int i = 0; i < 50; i++) { 
      p.add(new JLabel("t" + i)); 
    } 
    return p; 
} 

public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    f.getContentPane().add(new GridBagLayoutTagPanel()); 
    f.setSize(new Dimension(500, 300)); 
    f.setVisible(true); 
} 
} 
+0

đẹp câu hỏi 1 – mKorbel

+0

bạn đã thử sử dụng lớp 'FormDebugUtils' và/hoặc 'FormDebugPanel'? Các công cụ gỡ lỗi này đã giúp tôi một vài lần để xem điều gì đang thực sự xảy ra trên – Robin

+0

Tại sao bạn chỉ ra 'FlowLayout' khi mã chỉ rõ rằng' FormLayout' được sử dụng? 'FormLayout! = FlowLayout'. –

Trả lời

3

Với sự giúp đỡ của Rob và sử dụng của mình WrapPanelScrollablePanel nó hiện đang làm việc chính xác như nó nên

public class GridBagLayoutTagPanel extends JPanel { 
    private final int NB_TAGS = 5; 
    private final int NB_TAGVALUES = 50; 

    public GridBagLayoutTagPanel() { 
    setLayout(new GridLayout()); 

    ScrollablePanel pTags = new ScrollablePanel(new GridBagLayout()); 
    pTags.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT); 
    pTags.setBackground(Color.ORANGE); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.ipadx = 5; 
    c.ipady = 5; 

    int rowIndex = 0; 
    for (int i = 0; i < NB_TAGS; i++) { 
     // add tag name 
     JLabel lTagName = new JLabel(String.format("Tag %s:", i)); 
     lTagName.setFont(lTagName.getFont().deriveFont(Font.BOLD)); 
     c.fill = GridBagConstraints.NONE; 
     c.gridx = 0; 
     c.gridy = rowIndex++; 
     c.weightx = 0; // keep minimum size of the cell containing the label when resizing 
     c.weighty = 0; 
     pTags.add(lTagName, c); 

     // add tag values 
     JPanel pTag = new JPanel(new BorderLayout()); 
     pTag.add(new JLabel("+"), BorderLayout.LINE_START); // label used to add new tags 
     pTag.add(getWrapPanel(), BorderLayout.CENTER); // the list of tag values 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 1; 
     c.weightx = 1; // fill horizontally 
     c.weighty = 1; 
     pTags.add(pTag, c); 
    } 

    JScrollPane sp = new JScrollPane(pTags); 
    sp.setBorder(BorderFactory.createEmptyBorder()); 

    add(sp); 
    } 

    private JPanel getWrapPanel() { 
    JPanel p = new JPanel(new WrapLayout(FlowLayout.LEFT, 5, 0)); 

    for (int i = 0; i < NB_TAGVALUES; i++) { 
     p.add(new JLabel("t" + i)); 
    } 

    p.setSize(400, 1); 
    return p; 
    } 

    public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    f.getContentPane().add(new GridBagLayoutTagPanel()); 
    f.setSize(new Dimension(500, 300)); 
    f.setVisible(true); 
    } 
} 
11

tôi muốn mở rộng chiều cao của mỗi hàng chứa một FlowLayout với chiều cao hiện tại của các thành phần. Thật không may, kích thước ưa thích luôn luôn tương ứng với hight cho một hàng duy nhất.

Wrap Layout xử lý việc này.

+0

Điều này có vẻ là chính xác những gì tôi đang tìm kiếm. Tôi sẽ đánh dấu bài đăng là đã trả lời khi tôi có thể kiểm tra nó. Tôi ngạc nhiên không có trình quản lý bố cục chuẩn nào hoạt động như vậy vì nó có vẻ là một trường hợp sử dụng khá phổ biến. – Philippe

+0

Tôi đã thử hai tuần để làm việc này mà không thành công. Với mỗi trình quản lý bố cục, các vấn đề khác nhau xuất hiện. Sử dụng FormLayout jgoodies, kích thước của thành phần là 0 khi cần thiết để tính toán chiều cao và chiều rộng. Với GridBagLayout, việc tự động thay đổi kích thước không hoạt động tốt chút nào (có một ví dụ nếu ai đó muốn có một cái nhìn). Với SpringLayout, các thành phần luôn mở rộng theo chiều dọc với Springutilities.makeGrid() và dẫn đến các thẻ hiển thị trên một dòng khi sử dụng Springutilities.makecompactGrid(). – Philippe

2

Bạn đã thử MigLayout chưa? Đó là trình quản lý bố cục duy nhất mà tôi sử dụng và tôi chưa bao giờ tìm thấy bố cục mà tôi không thể làm được.

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