Mam tę JFrame
klasę 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);
}
}
Znalazłem również ten błąd, robiąc to:
JPanel nie jest jeszcze zainicjowany podczas przekazywania go do BoxLayout. Więc podziel tę linię w ten sposób:
To zadziała.
źródło
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:
źródło
Jeśli używasz układu na
JFrame
podobnym:Sterowanie jest faktycznie dodane do
ContentPane
tak będzie wyglądać to „wspólna” pomiędzyJFrame
iContentPane
Zrób to zamiast tego:
źródło
JFrame
że normalnie tego nie wymagają (w przeciwieństwie do AWTFrame
). ZJFrame
dokumentacji: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.
przezframe
odniesienie doJFrame
instancji.