2017-10-29 8 views
0

に中央のパネルでビューを中央に、私はUI 3とパネル、leftPanelmiddlePanelrightPanelを構築する必要があり、パネルはHorizontallyどのようにスイング

leftを整列させる必要があるとrightパネルは、としてmaximumequal幅を取得する必要があります中間パネルでは子コンポーネントとしての幅がminimumになりますが、パネルが追加されるとビューは中央パネルの中央に配置する必要があります。私はOracleのスイングのチュートリアルサイトからRuleクラスを使用していた

私はUI

import java.awt.Color; 
import java.awt.GridBagLayout; 

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class SwingTest extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public SwingTest() { 
     setTitle("Swing Test"); 
     setSize(750, 350); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(getParent()); 

     // Rule used to find the component positions, for the testing purpose 
     Rule rule = new Rule(Rule.HORIZONTAL, true); 
     rule.setPreferredWidth(10); 
     rule.setPreferredHeight(40); 

     SidePanel leftPanel = new SidePanel("Left"); 
     SidePanel rightPanel = new SidePanel("Right"); 

     JPanel middlePanel = new JPanel(); 
     middlePanel.setBorder(BorderFactory.createLineBorder(Color.black)); 

     // Add left,right and middle panel horizontally 
     JPanel containerPanel = new JPanel(); 
     containerPanel.setLayout(new BoxLayout(containerPanel, BoxLayout.X_AXIS)); 
     containerPanel.add(leftPanel); 
     containerPanel.add(middlePanel); 
     containerPanel.add(rightPanel); 

     // Add rule and container panel Vertically 
     JPanel outerPanel = new JPanel(); 
     outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS)); 
     outerPanel.add(rule); 
     outerPanel.add(containerPanel); 

     add(outerPanel); 
    } 

    public static void main(String[] args) { 
     SwingTest test = new SwingTest(); 
     test.setVisible(true); 
    } 

    private static class SidePanel extends JPanel { 
     private static final long serialVersionUID = 1L; 

     private SidePanel(String text) { 
      setLayout(new GridBagLayout()); 
      add(new JLabel(text)); 
     } 
    } 
} 

を構築するために、次のテストコードを行っている、部品の位置を見つけるために使用することができます。私は

に「UIのスクリーンショットに示され、ビューは中央のパネルを中心取得されていないとして、私が持っている問題は、= '+左中央のパネルの幅と中心ビュー今、右のパネルでRule.java

を取得します手動でパネルの高さと幅を設定したくない場合は、LayoutManager自身で処理する必要があります。私が欲しいもの

enter image description here

は、中央のパネルは道left + middle/2 = middle/2 + rightパネル幅の中央に取得する必要があります。

ミドルパネルを中央に表示させる方法が見つかりませんでしたが、誰かが私にこの解決策を見つけるのを助けてくれましたか?

答えて

1

BoxLayoutの仕組みを理解する必要があります。

最初のスペースは、各コンポーネントの推奨サイズで割り当てられます。次に余分なスペースがある場合、そのスペースは各コンポーネントに割り当てられます。

右のラベルの好ましいサイズが左のラベルよりも大きいため、中央が中央に表示されません。余分なスペースが割り当てられると、右側が左側よりも大きくなります。

これは簡単にテストできます。右側のパネルのテキストを "LEFT"に変更してください。

しかし、これは別の質問につながります。なぜ、中央のパネルのサイズが変わらないのですか?私はこれに対する答えを知らない。なんらかの理由で、デフォルトのFlowLayoutはGridBagLayoutとは異なる動作をしているようです。ここでも、中央パネルのレイアウトをGridBagLayoutに変更することでこれをテストできます。

左パネルと右パネルのサイズを同じにしたい場合は、Relative Layoutの使用を検討してください。このレイアウトを使用すると、基本的なコードは次のようになります:

RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS); 
JPanel panel = new JPanel(rl); 
panel.add(leftPanel, new Float(1)); 
panel.add(middle, new Float(3)); 
panel.add(rightPanel, new Float(1)); 

ここで、左右のパネルは、各パネルに追加されたコンポーネントとは独立した同じサイズになります。

関連する問題