błąd podczas przypisywania układu: nie można udostępnić BoxLayout

114

Mam tę JFrameklasę Java , w której chcę użyć boxlayout, ale pojawia się komunikat o błędzie java.awt.AWTError: BoxLayout can't be shared. Widziałem innych z tym problemem, ale rozwiązali go, tworząc układ w oknie zawartości, ale to właśnie tutaj robię. Oto mój kod:

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
źródło

Odpowiedzi:

173

Twój problem polega na tym, że tworzysz BoxLayoutfor a JFrame( this), ale ustawiasz go jako układ dla a JPanel( getContentPane()). Próbować:

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);
Michael Myers
źródło
5
Tak, ale usunięcie go spowodowałoby zamieszanie, prawda?
Michael Myers
75

Znalazłem również ten błąd, robiąc to:

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

JPanel nie jest jeszcze zainicjowany podczas przekazywania go do BoxLayout. Więc podziel tę linię w ten sposób:

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

To zadziała.

Joaquín M
źródło
16

Myślę, że jedną ważną rzeczą do podkreślenia z poprzednich odpowiedzi jest to, że cel BoxLayout (pierwszy parametr) powinien być tym samym kontenerem, z którego wywoływana jest metoda setLayout, jak w poniższym przykładzie:

JPanel XXXXXXXXX = new JPanel();
XXXXXXXXX.setLayout(new BoxLayout(XXXXXXXXX, BoxLayout.Y_AXIS));
diadyne
źródło
6

Jeśli używasz układu na JFramepodobnym:

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

Sterowanie jest faktycznie dodane do ContentPanetak będzie wyglądać to „wspólna” pomiędzy JFrameiContentPane

Zrób to zamiast tego:

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));
Charlie
źródło
Dang, uratowałeś mnie, - dlaczego jest to jedyna odpowiedź, która wspomina o getContentPane ()?
Alexander McNulty,
@AlexanderMcNulty, prawdopodobnie dlatego, JFrameże normalnie tego nie wymagają (w przeciwieństwie do AWT Frame). Z JFramedokumentacji: 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. przez frameodniesienie do JFrameinstancji.
alife
@AlexanderMcNulty, ponadto w JFrame jest tylko jedno okienko zawartości i zawsze jest tam gwarantowane.
alife