2011-08-24 38 views
13

Tôi đang sử dụng trình xây dựng GUI NetBeans để xử lý bố cục của mình (tôi rất kinh khủng với LayoutManagers) và đang cố gắng đặt một JLabel đơn giản sao cho nó luôn ở giữa (ngang) bên trong JPanel mẹ của nó . Lý tưởng nhất, điều này sẽ duy trì sự thật ngay cả khi JPanel đã được thay đổi kích thước, nhưng nếu đó là một số lượng mã hóa điên thì nó đủ để chỉ tập trung khi JPanel được tạo lần đầu tiên. Tôi không đủ khả năng tự mình xử lý bố cục, nhưng vì NetBeans GUI Builder tự động tạo mã không thể thay đổi, tôi không thể tìm ra cách làm điều này, và tôi không thể tìm thấy bất kỳ thứ gì trực tuyến để giúp tôi.Định tâm một nhãn JLabel trên JPanel

Nhờ bất kỳ ai có thể chỉ đạo tôi đi đúng hướng!

Trả lời

11

Bằng cách sử dụng Borderlayout, bạn có thể đặt bất kỳ JComponents nào vào khu vực TRUNG TÂM. Ví dụ: xem an answer to Stack Overflow question Get rid of the gap between JPanels. Điều này sẽ làm việc.

+0

cảm ơn phản hồi của bạn, tuy nhiên NetBeans GUI Build sử dụng GroupLayout và điều này không thể ghi đè. Hãy nhớ rằng tôi không chỉ cố gắng để chống lại Swing và LayoutManagers đe dọa của nó, tôi đang chiến đấu với một Builder Builder mà autogenerates mã đặc biệt cho GroupLayout! – IAmYourFaja

+0

+1: BorderLayout là đúng. – Heisenbug

+0

@Mara: tôi thực sự khuyên bạn nên bắt đầu tìm hiểu cách sử dụng trình quản lý bố cục. Nó không phải là khó khăn như vậy.Instead Thật khó để đạt được kết quả tương tự bằng cách sử dụng xây dựng gui. – Heisenbug

10

Ngay cả với BoxLayout bạn có thể đạt được điều đó: giải pháp

JPanel listPane = new JPanel(); 
listPane.setLayout(new BoxLayout(listPane, BoxLayout.X_AXIS)); 

JLabel label = new JLabel(); 
listPane.add(Box.createHorizontalGlue()); 
listPane.add(label); 
listPane.add(Box.createHorizontalGlue()); 

mKorbel là hoàn hảo cho mục tiêu của bạn. Dù sao tôi luôn luôn muốn đề xuất BoxLayout vì nó rất linh hoạt.

+0

Cảm ơn Overbose, nhưng tôi bị mắc kẹt với GroupLayout. Và nếu tôi dành quá nhiều thời gian hơn cho phía khách hàng, tôi chắc chắn sẽ đưa ra đề xuất của bạn và tìm hiểu LayoutManagers từ mặt đất. Tôi chỉ tìm kiếm một giải pháp nhanh chóng và bẩn thỉu. Điều đó sử dụng GroupLayout. – IAmYourFaja

+2

* "Tôi bị kẹt với GroupLayout" * Chỉ vì bạn không biết cách sử dụng Netbeans. Tôi không sử dụng nó, nhưng tôi đã nhìn thấy mã từ người dùng Netbeans (ngay cả khi sử dụng trình thiết kế GUI) đã sử dụng tất cả các bố cục chuẩn. –

26

Dưới đây là bốn cách để tập trung một phần:

4 Centered Components

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.*; 

class CenterComponent { 

    public static JLabel getLabel(String text) { 
     return getLabel(text, SwingConstants.LEFT); 
    } 

    public static JLabel getLabel(String text, int alignment) { 
     JLabel l = new JLabel(text, alignment); 
     l.setBorder(new LineBorder(Color.RED, 2)); 
     return l; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JPanel p = new JPanel(new GridLayout(2,2,4,4)); 
       p.setBackground(Color.black); 
       p.setBorder(new EmptyBorder(4,4,4,4)); 

       JPanel border = new JPanel(new BorderLayout()); 
       border.add(getLabel(
        "Border", SwingConstants.CENTER), BorderLayout.CENTER); 
       p.add(border); 

       JPanel gridbag = new JPanel(new GridBagLayout()); 
       gridbag.add(getLabel("GridBag")); 
       p.add(gridbag); 

       JPanel grid = new JPanel(new GridLayout()); 
       grid.add(getLabel("Grid", SwingConstants.CENTER)); 
       p.add(grid); 

       // from @0verbose 
       JPanel box = new JPanel(); 
       box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS)); 

       box.add(Box.createHorizontalGlue()); 
       box.add(getLabel("Box")); 
       box.add(Box.createHorizontalGlue()); 
       p.add(box); 

       JFrame f = new JFrame("Streeeetch me.."); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setContentPane(p); 
       f.pack(); 
       f.setLocationByPlatform(true); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+2

xuất sắc sau khi cập nhật +1 – mKorbel

6

Mara: "nhờ trả lời của bạn, tuy nhiên NetBeans GUI xây dựng sử dụng GroupLayout và điều này là không overridable."

Không đúng! Nhấp chuột phải vào bất kỳ nơi nào bên trong JFrame (hoặc bất kỳ vùng chứa GUI nào khác) trong trình tạo NetBeans GUI và chọn "Đặt bố cục". Theo mặc định được chọn "Thiết kế miễn phí", là bố cục nhóm, nhưng bạn có thể chọn bất kỳ bố cục nào khác bao gồm bố cục viền như được thông báo bởi mKorbel.

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