레이아웃 할당시 오류 : BoxLayout을 공유 할 수 없습니다.


114

JFrameboxlayout을 사용하려는 이 Java 클래스가 있지만 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

귀하의 문제는 당신이 만드는 것입니다 BoxLayoutA의을 JFrame( this), 그러나의 레이아웃으로 설정 JPanel( getContentPane()). 시험:

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

5
예,하지만 제거하면 문제가 혼동 될 것입니다. 그렇지 않습니까?
Michael Myers

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

이전 답변에서 강조해야 할 중요한 사항 중 하나는 BoxLayout의 대상 (첫 번째 매개 변수)이 다음 예제와 같이 setLayout 메서드가 호출되는 것과 동일한 컨테이너 여야한다는 것입니다.

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

6

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!"));

Dang you saved me,-왜 이것이 getContentPane ()을 언급하는 유일한 대답입니까?
Alexander McNulty

@AlexanderMcNulty, 아마도 JFrames는 일반적으로 필요하지 않기 때문일 것입니다 (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에는 콘텐츠 창이 하나만 있으며 항상 거기에 있음이 보장됩니다.
alife
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.