2017-05-17 9 views
0

に適しているのjava私はこのようになりますゲームを作るしようとしています:Layout Designレイアウトが私のレイアウト

私はこのために最も適したレイアウト設計を見つけようとしています。私はグリッドバッグのレイアウトを使用しようとしましたが、正しく追加されていないいくつかのコンポーネントがあります。

//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に1つのレイアウトを使用することではありません独自のレイアウトを使用します。もう一つのオプションは、MiGLayoutのようなより柔軟なサードパーティのレイアウトを使用することです。 –

+2

「私はこれに最も適したレイアウトデザインを見つけようとしています。」 - あなたは決して単一のレイアウトマネージャに制限されません。異なるレイアウトマネージャを使用してパネルをそれぞれネストすることで、必要なレイアウトを実現できます。したがって、コンポーネントのグループに対して適切なレイアウトマネージャを使用して画面を論理的に設計するための鍵です。 – camickr

+0

@DontKnowMuchButGettingBetterは、JPanelをプログラムに重く入れ子にしますか? – Grandevox

答えて

1

GridBagLayoutは使い方が非常に難しく、刑罰の対象者だけが使用しようとします。実際には、GUIビルダーが手作業でコード化するのではなく、むしろGUIビルダーが使用することを意図していました。

ネストされたレイアウトを使用する必要があります。あなたは実際にはかなり標準的なレイアウトを持っています。メインウィンドウではBorderLayoutを使用します(これはJFrameのようなすべてのトップレベルコンテナのデフォルトレイアウトです)。

HP、Start Adventure、MPは、X_AXIS BoxLayoutを使用するJPanelに含まれます(JPanelsはデフォルトでFlowLayoutを使用しているため、BoxLayoutに設定する必要があります)。 JPanelはBorderLayoutのNORTH位置に置かれます。

あなたの2つの通知テキストエリアは、おそらくJSplitPane(左側に1つのテキストエリア、右側にもう1つのテキストエリアがある)で最適な状態になり、分割ペインをBorderLayoutのCENTERに配置します。

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は1つのコンポーネントまたはそのグループを表示していますか?)、GridBagLayoutは確かにあなたが望むことをすることができます。

鍵はすべて1つでGridBagLayoutで試してみるのではなく、すべてがグリッドで整列する必要があるためです。

代わりに、画面を3行に分割します。レイアウトで3つの行(たとえばBoxLayout)を配置し、各行(たとえばGridBagLayout)内の別のレイアウトマネージャを使用して、その行内のコンポーネントをレイアウトします。

+0

私はそれを行う方法の例を教えてくれますか?または少なくともリンクは非常に高く評価されます! – Grandevox

+0

3つのJPanelを作成するだけです。それらをもう一方の下に配置します。コントロールの一番上の行を最初のJPanelに配置します。真ん中のJPanelの次の行。 JPanelの下の1つです。あなたは好きなように各行をレイアウトします。 –

+0

さて、私はそれを試してみましょう。提案ありがとう! – Grandevox

関連する問題