2017-05-17 17 views
0

에 적합합니다. 내가 gridbag 레이아웃을 사용했지만 올바르게 추가되지 않은 일부 구성 요소가 있습니다.어떤 자바 레이아웃 나는 이런 식으로 뭔가를 보이는 게임을 만들려고 노력하고 있어요 내 레이아웃

//Gridbag for the whole frame 
GridBagLayout gridbag = new GridBagLayout(); 
GridBagConstraints constraints = new GridBagConstraints(); 
this.setLayout(gridbag); 
constraints.fill = GridBagConstraints.BOTH; 
constraints.insets = new Insets(10, 10, 10, 10); 
constraints.weightx = 0.5; 

//Top left panel 
pnlHP = new JPanel(); 
pnlHP.setBackground(new Color (75, 55, 28)); 
gridbag.setConstraints(pnlHP, constraints); 
this.add(pnlHP); 

GridBagLayout gridbagHP = new GridBagLayout(); 
GridBagConstraints constraintsHP = new GridBagConstraints(); 
pnlHP.setLayout(gridbagHP); 
constraintsHP.fill = GridBagConstraints.BOTH; 
constraintsHP.insets = new Insets(10, 10, 10, 10); 
constraintsHP.weightx = 1.0; 

lblHPTitle = new JLabel(); 
lblHPTitle.setText("HP"); 
lblHPTitle.setForeground(Color.WHITE); 
lblHPTitle.setFont(new Font("Arial", Font.PLAIN, 60)); 
gridbagHP.setConstraints(lblHPTitle, constraintsHP); 
pnlHP.add(lblHPTitle); 

lblHP = new JLabel(); 
lblHP.setText("asdf"); 
lblHP.setForeground(Color.WHITE); 
lblHP.setFont(new Font("Arial", Font.PLAIN, 20)); 
lblHP.setHorizontalAlignment(SwingConstants.RIGHT); 
constraintsHP.gridwidth = GridBagConstraints.REMAINDER; 
gridbagHP.setConstraints(lblHP, constraintsHP); 
pnlHP.add(lblHP); 

pgbHP = new JProgressBar(); 
pgbHP.setBackground(new Color (75, 55, 28)); 
pgbHP.setValue(25); 
constraintsHP.weightx = 0.0; 
gridbagHP.setConstraints(pgbHP, constraintsHP); 
pnlHP.add(pgbHP); 

//Top center part 
btnGo = new JButton(); 
btnGo.setBackground(new Color (126, 72, 28)); 
btnGo.setText("Start Adventure!"); 
btnGo.setForeground(Color.WHITE); 
btnGo.setFont(new Font("Arial", Font.PLAIN, 42)); 
gridbag.setConstraints(btnGo, constraints); 
this.add(btnGo); 

//Top right panel 
pnlMPSP = new JPanel(); 
pnlMPSP.setBackground(new Color (75, 55, 28)); 
constraints.gridwidth = GridBagConstraints.REMAINDER; 
gridbag.setConstraints(pnlMPSP, constraints); 
this.add(pnlMPSP); 

GridBagLayout gridbagMPSP = new GridBagLayout(); 
GridBagConstraints constraintsMPSP = new GridBagConstraints(); 
pnlMPSP.setLayout(gridbagMPSP); 
constraintsMPSP.fill = GridBagConstraints.BOTH; 
constraintsMPSP.insets = new Insets(10, 10, 10, 10); 
constraintsMPSP.weightx = 1.0; 

lblMPSP = new JLabel(); 
lblMPSP.setText("asdf"); 
lblMPSP.setForeground(Color.WHITE); 
lblMPSP.setFont(new Font("Arial", Font.PLAIN, 20)); 
gridbagMPSP.setConstraints(lblMPSP, constraintsMPSP); 
pnlMPSP.add(lblMPSP); 

lblMPSPTitle = new JLabel(); 
lblMPSPTitle.setText("MP"); 
lblMPSPTitle.setForeground(Color.WHITE); 
lblMPSPTitle.setFont(new Font("Arial", Font.PLAIN, 60)); 
lblMPSPTitle.setHorizontalAlignment(SwingConstants.RIGHT); 
constraintsMPSP.gridwidth = GridBagConstraints.REMAINDER; 
gridbagMPSP.setConstraints(lblMPSPTitle, constraintsMPSP); 
pnlMPSP.add(lblMPSPTitle); 

pgbMPSP = new JProgressBar(); 
pgbMPSP.setBackground(new Color (0, 0, 255)); 
pgbMPSP.setValue(25); 
constraintsMPSP.weightx = 0.0; 
gridbagMPSP.setConstraints(pgbMPSP, constraintsMPSP); 
pnlMPSP.add(pgbMPSP); 

//Middle Left 
lblNotifications = new JLabel(); 
lblNotifications.setText("<html>N<br>o<br>t<br>i<br>f<br>i<br>c<br>a<br>t<br>i<br>o<br>n<br>s</html>"); 
lblNotifications.setFont(new Font("Arial", Font.PLAIN, 20)); 
lblNotifications.setBackground(Color.WHITE); 
gridbag.setConstraints(lblNotifications, constraints); 
this.add(lblNotifications); 

//Middle Center 
txtNotifCenter = new JTextPane(); 
txtNotifCenter.setBackground(new Color (205, 160, 96)); 
txtNotifCenter.setEnabled(false); 
txtNotifCenter.setDisabledTextColor(Color.black); 
scpNotifCenter = new JScrollPane(txtNotifCenter); 
scpNotifCenter.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 
gridbag.setConstraints(scpNotifCenter, constraints); 
this.add(scpNotifCenter); 

//Middle Right 
txtXPInfo = new JTextPane(); 
txtXPInfo.setBackground(new Color (205, 160, 96)); 
txtXPInfo.setEnabled(false); 
txtXPInfo.setDisabledTextColor(Color.black); 
scpXPInfo = new JScrollPane(txtXPInfo); 
scpXPInfo.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 
constraints.gridwidth = GridBagConstraints.REMAINDER; 
gridbag.setConstraints(scpXPInfo, constraints); 
this.add(scpXPInfo); 

//I haven't made the bottom part yet 

this.pack(); 
이 실행 된 경우

의 lblNotifications 및 txtNotifCenter (또는 scpNotifCenter)가 동일한 폭을 가진 것 같았다 : 이것은 내 코드입니다. 나는 그것을 그림과 같이 만들고 싶었다. 다른 레이아웃을 사용해야합니까, 아니면 그냥 잘못된 방식으로 격자 가방 레이아웃을 사용하고 있습니까? 미리 감사드립니다.

+2

한 가지 가능한 해결책은 아니라 둥지 JPanel의 단일 레이아웃을 사용하지 않는 것입니다, 각 자체 레이아웃을 사용합니다. 또 다른 옵션은 MiGLayout과 같은보다 유연한 타사 레이아웃을 사용하는 것입니다. –

+2

'이것에 가장 적합한 레이아웃 디자인을 찾으려고합니다. '- 당신은 결코 하나의 레이아웃 매니저로 제한되지 않습니다. 다른 레이아웃 관리자를 사용하여 패널을 각각 중첩시킬 수 있으므로 원하는 레이아웃을 얻을 수 있습니다. 따라서 구성 요소 그룹에 적절한 레이아웃 관리자를 사용하여 화면을 논리적으로 설계하는 것이 중요합니다. – camickr

+0

@DontKnowMuchButGettingBetter는 JPanels를 프로그램에 매우 중첩시킬 것입니까? – Grandevox

답변

1

GridBagLayout은 사용하기가 매우 어려우며 처벌을위한 애 태우는 사람 만 사용하려고합니다. 실제로 원래는 GUI 빌더가 손으로 코딩하지 않고 사용하려고했습니다.

중첩 된 레이아웃을 사용해야합니다. 당신은 실제로 꽤 표준적인 레이아웃을 가지고 있습니다. 주 윈도우의 경우 BorderLayout을 사용하십시오 (그리고 이것은 JFrame과 같은 모든 최상위 컨테이너의 기본 레이아웃입니다).

HP, Start Adventure 및 MP는 X_AXIS BoxLayout을 사용하는 JPanel에 있습니다 (JPanels는 기본적으로 FlowLayout을 사용하므로 BoxLayout으로 설정해야합니다). JPanel은 BorderLayout의 NORTH 위치에 놓이게됩니다.

두 개의 알림 텍스트 영역은 JSplitPane (왼쪽에는 텍스트 영역 하나, 오른쪽에는 다른 텍스트 영역)이있는 것이 가장 좋을 것입니다. 그런 다음 분할 창을 BorderLayout의 가운데에 놓습니다.

그러면 CharMode, Level 및 Logout은 X_AXIS BoxLayout을 사용하여 또 다른 JPanel에있게됩니다. JPanel은 BorderLayout의 남쪽 위치에 있습니다. 국경과 상자 레이아웃에 대한

자습서 :

https://docs.oracle.com/javase/tutorial/uiswing/layout/border.html https://docs.oracle.com/javase/tutorial/uiswing/layout/box.html

분할 창] :

https://docs.oracle.com/javase/tutorial/uiswing/components/splitpane.html

+0

감사합니다. 이것은 내가 성취하고자했던 것과 아주 잘 작동합니다! – Grandevox

+0

Swing 대신 JavaFX를 사용하는 것이 좋습니다 (JavaFX가 Swing을 대체합니다). JavaFX를 사용하면 SceneBuilder를 사용하여 GUI를 작성할 수 있습니다 (설명 된 일반 레이아웃을 계속 사용할 수 있습니다 ... 지정된 축이있는 BoxLayout 대신 HBox 및 VBox가 있음). 또한 매우 CSS와 유사한 구문으로 JavaFX 구성 요소의 스타일을 지정할 수 있습니다. 아마 모형처럼 보일 수도 있습니다. JavaFX 시작 링크 : http://docs.oracle.com/javase/8/javase-clienttechnologies.htm CSS : http://docs.oracle.com/javase/8/javafx/user-interface-tutorial/css_tutorial .htm # JFXUI733 – Michael

+0

알겠습니다. 감사! – Grandevox

1

화면의 어느 부분이 구성 요소이고 어떤 구성 요소가 아닌지는 확실하지 않습니다 (예 : hp 디스플레이 구성 요소 또는 그 그룹입니까?). GridBagLayout은 확실히 원하는대로 할 수 있습니다.

열쇠는 모두 GridBagLayout으로 시도하고 실행하지 않아야합니다. 그때 모든 것이 그리드에 맞춰져야하기 때문입니다.

대신 화면을 세 줄로 나눕니다. 레이아웃을 사용하여 세 행 (예 : BoxLayout)을 정렬 한 다음 각 행 (예 : GridBagLayout)의 개별 레이아웃 관리자를 사용하여 해당 행에 구성 요소를 배치합니다.

+0

나에게 그걸 어떻게하는지 보여 줄 수 있겠 니? 또는 적어도 링크는 대단히 감사하겠습니다! – Grandevox

+0

3 개의 JPanel을 생성하면됩니다. 그것들을 다른 것의 아래에 배치하십시오. 첫 번째 JPanel에 컨트롤의 맨 윗줄을 놓습니다. JPanel의 가운데에있는 다음 행. JPanel의 맨 아래 부분. 원하는대로 각 행을 레이아웃하십시오. –

+0

좋아, 내가 해보겠습니다. 귀하의 제안에 감사드립니다! – Grandevox