kesalahan saat menetapkan Layout: BoxLayout tidak dapat dibagikan


114

Saya memiliki JFramekelas Java ini , di mana saya ingin menggunakan boxlayout, tetapi saya mendapatkan pesan kesalahan java.awt.AWTError: BoxLayout can't be shared. Saya telah melihat orang lain dengan masalah ini, tetapi mereka menyelesaikannya dengan membuat tata letak kotak di panel konten, tetapi itulah yang saya lakukan di sini. Ini kode saya:

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

Jawaban:


173

Masalah Anda adalah Anda membuat BoxLayoutuntuk a JFrame( this), tetapi menyetelnya sebagai tata letak untuk a JPanel( getContentPane()). Mencoba:

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

5
Ya, tetapi menghapusnya akan membingungkan masalahnya, bukan?
Michael Myers

75

Saya juga menemukan kesalahan ini saat membuat ini:

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

JPanel belum diinisialisasi saat meneruskannya ke BoxLayout. Jadi pisahkan baris ini seperti ini:

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

Ini akan berhasil.


16

Saya pikir satu hal penting untuk disorot dari jawaban sebelumnya adalah bahwa target BoxLayout (parameter pertama) harus merupakan Container yang sama dengan metode setLayout yang dipanggil seperti pada contoh berikut:

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

6

Jika Anda menggunakan tata letak JFrameseperti:

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

Kontrol sebenarnya ditambahkan ke ContentPanesehingga akan terlihat seperti 'dibagi' antara JFramedanContentPane

Lakukan ini sebagai gantinya:

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

Dang Anda menyelamatkan saya, - mengapa ini satu-satunya jawaban yang menyebutkan getContentPane ()?
Alexander McNulty

@AlexanderMcNulty, mungkin karena JFramebiasanya tidak memerlukannya (tidak seperti AWT Frame). Dari JFramedokumentasi: 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. Dengan framemereka mengacu pada sebuah JFramecontoh.
hidup

@AlexanderMcNulty, lebih lanjut, hanya ada satu panel konten di JFrame, dan selalu dijamin ada.
hidup
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.