2009-05-22 38 views
9

Tôi có bảng điều khiển đang sử dụng bố cục nhóm để sắp xếp một số nhãn. Tôi muốn giữ trung tâm bảng điều khiển của màn hình khi kích thước lại. Nếu tôi đặt bảng điều khiển bên trong một bảng điều khiển khác bằng cách sử dụng bố cục lưu lượng, tôi có thể giữ các nhãn được căn giữa theo chiều ngang nhưng không được theo chiều dọc. Trình quản lý bố cục nào sẽ cho phép tôi giữ bảng ở giữa màn hình?Trình quản lý bố cục Java Trung tâm dọc

Tôi cũng đã thử bố cục viền và đặt nó ở giữa nhưng nó đổi kích thước cửa sổ.

Trả lời

20

Thử sử dụng GridBagLayout và thêm bảng điều khiển có đối tượng trống GridBagConstrants.
Ví dụ:

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setLayout(new GridBagLayout()); 
    JPanel panel = new JPanel(); 
    panel.add(new JLabel("This is a label")); 
    panel.setBorder(new LineBorder(Color.BLACK)); // make it easy to see 
    frame.add(panel, new GridBagConstraints()); 
    frame.setSize(400, 400); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 
+2

Tôi đã luôn tự hỏi làm thế nào để làm điều này, cuối cùng tôi đã từ bỏ và sử dụng MigLayout để thay thế. – gencoreoperative

+4

Đây là những gì tôi nghĩ về gridbag: http://madbean.com/anim/totallygridbag/ :) – qben

+0

GridBagLayout không HARD khi container nhỏ hơn kích thước ưa thích (nhưng lớn hơn kích thước tối thiểu) của trẻ. –

9

Trước tiên, tôi nên đề cập đến, đọc bài viết của tôi về trình bày: http://web.archive.org/web/20120420154931/http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/. Đó là cũ nhưng rất hữu ích (tiếc rằng bài viết trước ngày BoxLayout Tôi có một số slide khi tôi đã có cuộc nói chuyện tại JavaOne, trong đó bao gồm BoxLayout tại http://javadude.com/articles/javaone.)

Hãy thử BoxLayout:

Box verticalBox = Box.createVerticalBox(); 
verticalBox.add(Box.createVerticalGlue()); 
verticalBox.add(stuffToCenterVertically); 
verticalBox.add(Box.createVerticalGlue()); 

và nếu bạn muốn để tập trung thứ đó, sử dụng một HorizontalBox như stuffToCenterVertically:

Box horizontalBox = Box.createHorizontalBox(); 
horizontalBox.add(Box.createHorizontalGlue()); 
horizontalBox.add(stuffToCenter); 
horizontalBox.add(Box.createHorizontalGlue()); 

Way dễ dàng hơn để "nhìn thấy" trong mã hơn gridbag

+1

Tôi đồng ý rằng GridBagLayout nói chung phức tạp hơn, nhưng để căn giữa một bảng, chỉ có hai dòng. –

+0

Vấn đề là bạn không thể "nhìn thấy" khi đọc mã ... (Tôi đã sửa câu trả lời của tôi thành "xem" thay vì "dễ dàng hơn" ...) –

+0

Tôi "thấy" ... Nhưng trên Mặt khác, "createVerticalGlue()" cũng không có ý nghĩa gì đối với tôi, mà không đọc tài liệu. –

0

GroupLayout trên bảng điều khiển chính nó, với GroupLayout.Alignment.CENTER, cho cả dọc và ngang, và setPreferredSize(new Dimension(yourChosenWidth,yourChosenHeight)) để đặt bảng điều khiển không đổi kích thước.

Bạn cũng có thể làm setMinimumSize và đặt Kích thước tối đa trên bảng điều khiển, chỉ để an toàn.

Nếu bạn cảm thấy chóng mặt, bạn chỉ có thể sử dụng một GroupLayout duy nhất cho toàn bộ điều, bằng cách chọn cẩn thận các nhóm song song/tuần tự và nhóm nhãn phù hợp.

0

Bạn có thể xây dựng LayoutManager của riêng bạn để căn giữa một thành phần đơn (cả trục hoặc chỉ một). Đây là một trong đó hiện nó trên cả hai trục, bạn có thể dễ dàng thay đổi nó để có trung tâm theo chiều dọc hoặc ngang.

Sơ đồ bố trí thực hiện hiện đầu tiên con có thể nhìn thấy, bạn có thể thay đổi điều đó quá ...

public class CentreLayout implements LayoutManager, java.io.Serializable { 

public void addLayoutComponent(String name, Component comp) { 
} 

public void removeLayoutComponent(Component comp) { 
} 

public Dimension preferredLayoutSize(Container target) { 
    return target.getPreferredSize(); 
} 

public Dimension minimumLayoutSize(Container target) { 
    return target.getMinimumSize(); 
} 

public void layoutContainer(Container target) { 
    synchronized (target.getTreeLock()) { 
     Insets insets = target.getInsets(); 
     Dimension size = target.getSize(); 
     int w = size.width - (insets.left + insets.right); 
     int h = size.height - (insets.top + insets.bottom); 
     int count = target.getComponentCount(); 

     for (int i = 0; i < count; i++) { 
      Component m = target.getComponent(i); 
      if (m.isVisible()) { 
       Dimension d = m.getPreferredSize(); 
       m.setBounds((w - d.width)/2, (h - d.height)/2, d.width, d.height); 
       break; 
      } 
     } 
    } 
} 

} 
+0

thật không may, điều này không làm việc cho tôi. Tôi nhận được một tràn ngăn xếp (haha) trong phương thức 'preferredLayoutSize'. – Atmocreations

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