เกิดข้อผิดพลาดในการกำหนด Layout: BoxLayout ไม่สามารถแชร์ได้


114

ฉันมีนี้ Java JFrameชั้นในสิ่งที่ฉันต้องการที่จะใช้ BoxLayout java.awt.AWTError: BoxLayout can't be sharedแต่ผมได้รับข้อผิดพลาดว่า ฉันเคยเห็นคนอื่นมีปัญหานี้ แต่พวกเขาแก้ไขได้โดยการสร้าง boxlayout บนแผงเนื้อหา แต่นั่นคือสิ่งที่ฉันทำที่นี่ นี่คือรหัสของฉัน:

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);
    }
}

คำตอบ:


173

ปัญหาของคุณคือคุณกำลังสร้างBoxLayoutสำหรับ a JFrame( this) แต่ตั้งค่าเป็นเลย์เอาต์สำหรับ a JPanel( getContentPane()) ลอง:

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

5
ใช่ แต่การลบออกจะทำให้เกิดความสับสนตอนนี้จะไม่หรือไม่
Michael Myers

75

ฉันยังพบข้อผิดพลาดนี้ในการทำสิ่งนี้:

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

JPanel ยังไม่เริ่มต้นเมื่อส่งไปยัง BoxLayout แยกบรรทัดออกมาเป็นแบบนี้:

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

วิธีนี้จะได้ผล


16

ฉันคิดว่าสิ่งสำคัญอย่างหนึ่งที่ต้องเน้นจากคำตอบก่อนหน้านี้คือเป้าหมายของ BoxLayout (พารามิเตอร์แรก) ควรเป็นคอนเทนเนอร์เดียวกับที่เมธอด setLayout ถูกเรียกใช้ดังตัวอย่างต่อไปนี้:

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

6

หากคุณใช้เลย์เอาต์ที่JFrameชอบ:

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

การควบคุมกำลังถูกเพิ่มเข้าไปในตัวควบคุมContentPaneดังนั้นจึงดูเหมือนว่า 'ใช้ร่วมกัน' ระหว่างJFrameไฟล์ContentPane

ทำสิ่งนี้แทน:

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

แดงคุณช่วยฉัน - ทำไมนี่เป็นคำตอบเดียวที่กล่าวถึง getContentPane ()
Alexander McNulty

@AlexanderMcNulty อาจเป็นเพราะJFrameปกติแล้วไม่ต้องการมัน (ไม่เหมือน AWT Frame) จากJFrameเอกสาร: 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. โดยframeอ้างถึงJFrameอินสแตนซ์
alife

@AlexanderMcNulty นอกจากนี้ยังมีบานหน้าต่างเนื้อหาเดียวใน JFrame และรับประกันว่าจะอยู่ที่นั่นเสมอ
alife
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.