レイアウト割り当て時のエラー:BoxLayoutは共有できません


114

私はこのJava JFrameクラスを持っています。ここで、boxlayoutを使用したいのですが、というエラーが表示されますjava.awt.AWTError: BoxLayout can't be shared。私はこの問題を抱えている他の人を見てきましたが、彼らはcontentpaneにboxlayoutを作成することによってそれを解決しましたが、それは私がここでやっていることです。これが私のコードです:

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

回答:


173

あなたの問題は、あなたが作成しているということであるBoxLayoutためにJFramethis)、しかし、のレイアウトとして設定しますJPanelgetContentPane())。試してください:

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

5
はい、しかしそれを削除すると問題が混乱しますが、今ではそうではありませんか?
マイケルマイヤーズ

75

私はこれを作るこのエラーも見つけました:

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

JPanelは、BoxLayoutに渡すときにまだ初期化されていません。したがって、この行を次のように分割します。

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

これは機能します。


16

以前の回答から強調すべき重要なことの1つは、BoxLayoutのターゲット(最初のパラメーター)が、次の例のように、setLayoutメソッドが呼び出されているのと同じコンテナーでなければならないということです。

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

5

いいね!でレイアウトを使用しているJFrame場合:

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

コントロールは実際にに追加されているContentPaneため、JFrameとの間で「共有」されているように見えますContentPane

代わりにこれを行ってください:

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

お前は私を救った-なぜこれがgetContentPane()について言及する唯一の答えなのか?
Alexander McNulty

@AlexanderMcNulty、おそらくはJFrame(AWTとは異なりFrame)通常は必要としません。JFrameドキュメント: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. することによりframe、それらを参照しているJFrameインスタンス。
alife

@AlexanderMcNulty、さらに、JFrameにはコンテンツペインが1つしかなく、常にそこにあることが保証されています。
alife
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.