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

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)
);
Michael Myers
sumber
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.

Joaquín M
sumber
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));
diadyne
sumber
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!"));
Charlie
sumber
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