2017-10-26 10 views
0

저는 컴퓨터 과학 수업에 대한 소개에서 방금 배운 GUI 작성에 익숙해 지도록 간단한 계산기를 만들려고합니다. 내가 원하는 방식으로 GUI를 배열하는 데 문제가 있습니다. 나는 BoxLayout에서는 완벽하다고 생각하지만, 나는 그것을 사용하려고 할 때마다, 내 프로그램이 오류 로그와 충돌 : 나는이 변경 될 때Java : BoxLayout을 공유 할 수 없습니다. 오류

import java.awt.FlowLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JLabel; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 

public class GUI implements Runnable{ 

@Override 
public void run() { 
    JFrame window = new JFrame("Calculator"); 
    window.setLayout(new BoxLayout(window, BoxLayout.Y_AXIS)); 

    JPanel display = new JPanel(); 
    JLabel label = new JLabel("display test"); 
    display.add(label); 

    JPanel row1 = new JPanel(); 
    JButton sevenButton = new JButton("7"); 
    JButton eightButton = new JButton("8"); 
    JButton nineButton = new JButton("9"); 
    JButton divideButton = new JButton("÷"); 

    JPanel row2 = new JPanel(); 
    JButton fourButton = new JButton("4"); 
    JButton fiveButton = new JButton("5"); 
    JButton sixButton = new JButton("6"); 
    JButton multiplyButton = new JButton("x"); 

    JPanel row3 = new JPanel(); 
    JButton oneButton = new JButton("1"); 
    JButton twoButton = new JButton("2"); 
    JButton threeButton = new JButton("3"); 
    JButton minusButton = new JButton("-"); 

    JPanel row4 = new JPanel(); 
    JButton periodButton = new JButton("."); 
    JButton zeroButton = new JButton("0"); 
    JButton enterButton = new JButton("="); 
    JButton addButton = new JButton("+"); 

    row1.add(sevenButton); 
    row1.add(eightButton); 
    row1.add(nineButton); 
    row1.add(divideButton); 

    row2.add(fourButton); 
    row2.add(fiveButton); 
    row2.add(sixButton); 
    row2.add(multiplyButton); 

    row3.add(oneButton); 
    row3.add(twoButton); 
    row3.add(threeButton); 
    row3.add(minusButton); 

    row4.add(periodButton); 
    row4.add(zeroButton); 
    row4.add(enterButton); 
    row4.add(addButton); 

    window.add(display); 
    window.add(row1); 
    window.add(row2); 
    window.add(row3); 
    window.add(row4); 

    window.pack(); 
    window.setVisible(true); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

} 

이 프로그램은 잘 작동 : 여기

Exception in thread "AWT-EventQueue-0" java.awt.AWTError: BoxLayout can't be shared 
at javax.swing.BoxLayout.checkContainer(Unknown Source) 
at javax.swing.BoxLayout.invalidateLayout(Unknown Source) 
at javax.swing.BoxLayout.addLayoutComponent(Unknown Source) 
at java.awt.Container.addImpl(Unknown Source) 
at java.awt.Container.add(Unknown Source) 
at javax.swing.JFrame.addImpl(Unknown Source) 
at java.awt.Container.add(Unknown Source) 
at GUI.run(GUI.java:64) 
at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

내 코드입니다 FlowLayout에 BoxLayout하지만, 그것은 내 프로그램에 대해 원하는 레이아웃 유형이 아닙니다.

//window.setLayout(new BoxLayout(window, BoxLayout.Y_AXIS)); 
JPanel contentPane = new JPanel(); 
contentPane.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
window.setContentPane(contentPane); 

당신이 BoxLayout 프레임의 컨텐츠 구획으로 사용되는 패널에 추가되어 있는지 확인하다이 방법 :

+0

이'JFrame'가'contentPane'을 포함하는'JRootPane' 있습니다

다른 옵션은 "contentPane에"패널에 직접 모든 구성 요소를 추가 한 다음 프레임에이 패널을 추가하는 것입니다 구성 요소가 배치되는 곳입니다. 'JFrame # setLayout'가이 호출을'contentPane'에 전달하지 않을 가능성이 있습니다. 이것은 문제를 설명 할 것입니다 – MadProgrammer

답변

1

같은 것을보십시오.

//window.setLayout(new BoxLayout(window, BoxLayout.Y_AXIS)); 
JPanel contentPane = new JPanel(); 
contentPane.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

... 

//window.add(display); 
//window.add(row1); 
//window.add(row2); 
//window.add(row3); 
//window.add(row4); 
contentPane.add(display); 
contentPane.add(row1); 
contentPane.add(row2); 
contentPane.add(row3); 
contentPane.add(row4); 
window.add(contentPane);