Düzen atanırken hata: BoxLayout paylaşılamaz


114

JFrameBir kutu düzeni kullanmak istediğim bu Java sınıfına sahibim, ancak söylerken bir hata alıyorum java.awt.AWTError: BoxLayout can't be shared. Bu sorunu olan başkalarını da gördüm, ancak içerik panelinde kutu düzeni oluşturarak sorunu çözdüler, ama burada yaptığım şey bu. İşte kodum:

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

Yanıtlar:


173

Sizin sorununuz, BoxLayouta JFrame( this) için a oluşturuyor , ancak bunu a JPanel( getContentPane()) için düzen olarak ayarlamanızdır . Deneyin:

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

5
Evet, ama onu kaldırmak sorunun kafasını karıştırır, değil mi?
Michael Myers

75

Ayrıca bunu yaparken bu hatayı buldum:

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

JPanel, BoxLayout'a aktarılırken henüz başlatılmadı. Öyleyse bu satırı şöyle bölün:

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

Bu çalışacak.


16

Önceki cevaplardan vurgulanması gereken önemli bir şeyin, BoxLayout'un hedefinin (ilk parametre) aşağıdaki örnekte olduğu gibi setLayout yönteminin çağrıldığı Konteyner ile aynı olması gerektiğini düşünüyorum:

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

6

Düzeni JFramebenzer bir şekilde kullanıyorsanız:

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

Kontrol aslında öğesine eklendiğinden ContentPane, JFrameve arasında 'paylaşılmış' gibi görünecektir .ContentPane

Bunun yerine şunu yapın:

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

Beni kurtardın, - getContentPane () 'den bahseden tek cevap neden bu?
Alexander McNulty

@AlexanderMcNulty, muhtemelen JFrames normalde gerektirmediğinden ( AWT'nin aksine Frame). Gönderen JFramebelgeler: 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. By frameonlar bahsettiğiniz JFrameörneği.
alife

@AlexanderMcNulty, ayrıca bir JFrame'de yalnızca bir içerik bölmesi vardır ve her zaman orada olması garanti edilir.
alife
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.