lỗi khi chỉ định Bố cục: Không thể chia sẻ BoxLayout


114

Tôi có JFramelớp Java này , trong đó tôi muốn sử dụng một boxlayout, nhưng tôi gặp lỗi nói java.awt.AWTError: BoxLayout can't be shared. Tôi đã gặp những người khác gặp sự cố này, nhưng họ đã giải quyết nó bằng cách tạo boxlayout trên contentpane, nhưng đó là những gì tôi đang làm ở đây. Đây là mã của tôi:

class EditDialog extends JFrame {
    JTextField title = new JTextField();
    public editDialog() {
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setTitle("New entity");
        getContentPane().setLayout(
            new BoxLayout(this, BoxLayout.PAGE_AXIS));
        add(title);
        pack();
        setVisible(true);
    }
}

Câu trả lời:


173

Vấn đề của bạn là bạn đang tạo một BoxLayoutcho JFrame( this), nhưng lại đặt nó làm bố cục cho một JPanel( getContentPane()). Thử:

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);

5
Có, nhưng loại bỏ nó sẽ làm rối loạn vấn đề, bây giờ phải không?
Michael Myers

75

Tôi cũng đã tìm thấy lỗi này làm cho điều này:

JPanel panel = new JPanel(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

JPanel chưa được khởi tạo khi chuyển nó đến BoxLayout. Vì vậy, chia dòng này như thế này:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

Điều này sẽ hoạt động.


16

Tôi nghĩ rằng một điều quan trọng cần làm nổi bật từ các câu trả lời trước là mục tiêu của BoxLayout (tham số đầu tiên) phải là cùng một Vùng chứa mà phương thức setLayout đang được gọi như trong ví dụ sau:

JPanel XXXXXXXXX = new JPanel();
XXXXXXXXX.setLayout(new BoxLayout(XXXXXXXXX, BoxLayout.Y_AXIS));

6

Nếu bạn đang sử dụng bố cục JFramenhư sau:

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));

Việc kiểm soát thật sự đang được thêm vào ContentPanevì vậy nó sẽ trông giống như nó là 'chia sẻ' giữa JFrameContentPane

Làm điều này thay thế:

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));

Bạn đã cứu tôi, - tại sao đây là câu trả lời duy nhất đề cập đến getContentPane ()?
Alexander McNulty

@AlexanderMcNulty, có thể là do JFramethường không yêu cầu nó (không giống như AWT Frame). Từ JFrametài liệu: As a convenience, the add, remove, and setLayout methods of this class are overridden, so that they delegate calls to the corresponding methods of the ContentPane. For example, you can add a child component to a frame as follows: frame.add(child); And the child will be added to the contentPane. The content pane will always be non-null. Bởi framehọ đang đề cập đến một JFramephiên bản.
alife

@AlexanderMcNulty, hơn nữa, chỉ có một ngăn nội dung trong JFrame và nó luôn được đảm bảo ở đó.
alife
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.