2016-07-04 11 views
0

SpringLayoutでJPanelを適切に計算する方法がわかりません。現在は常に(0、0)です。私はpanel.setPreferredSize(layout.preferredLayoutSize(panel));を呼び出してみましたが、何も変更しません。私はまた、パネル南側と東側に最も南/東のコンポーネントに比較的制約を置いてみました(そして、それが私に適切なサイズを与え始めている間に、JFrameのサイズを変更するとGUIが完全に台無しになります例えば、いくつかの構成要素が視野外にシフトし、互いに重なり合うなど)。JPanelのSpringLayout preferredSizeで正しい値が計算されない

public class TileView extends JPanel { 

    private TilesController controller; 

    private JRadioButton paint, select; 
    private JPanel prototype_panel, selection_panel; 

    public TileView (TilesController tiles_controller) { 
     controller = tiles_controller; 
     SpringLayout layout = new SpringLayout(); 
     setLayout(layout); 

     prototype_panel = new TileBrushPanel(controller); 
     selection_panel = new TileSelectionPanel(controller); 
     paint = new JRadioButton("draw"); 
     paint.addActionListener(l -> controller.setPaintTileMode()); 
     select = new JRadioButton ("select"); 
     select.addActionListener(l -> controller.setSelectMode()); 

     ButtonGroup bGroup = new ButtonGroup(); 
     bGroup.add(paint); 
     bGroup.add(select); 

     layout.putConstraint(NORTH, paint, 4, NORTH, this); 
     layout.putConstraint(WEST, paint, 4, WEST, this); 
     add (paint); 

     layout.putConstraint(NORTH, select, 0, NORTH, paint); 
     layout.putConstraint(WEST, select, 4, EAST, paint); 
     add (select); 

     layout.putConstraint(NORTH, prototype_panel, 4, NORTH, paint); 
     layout.putConstraint(WEST, prototype_panel, 4, WEST, this); 
     add (prototype_panel); 

     layout.putConstraint(NORTH, selection_panel, 0, NORTH, prototype_panel); 
     layout.putConstraint(WEST, selection_panel, 4, EAST, prototype_panel); 
     add (selection_panel); 

     //layout.putConstraint(SOUTH, this, 4, SOUTH, prototype_panel); 
     //layout.putConstraint(EAST, this, 0, EAST, selection_panel); 
     setPreferredSize(layout.preferredLayoutSize(this)); 

    } 

} 
+0

コンポーネントまたは 'pack()'の囲みウィンドウを 'validate()'するとどうなりますか? – trashgod

+0

1)すぐに役立つようにするには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 2)「Java Swingでset(Preferred | Maximum | Minimum)Sizeメソッドを使用しないでください。」(http://stackoverflow.com/q/7229226/418556)(はい。 –

答えて

3

たSpringLayoutがうまく働いている:

この

は私に問題を与えているクラスです。あなたは初めてそれを正しくしました。最後の2つのputConstraint呼び出しのコメントを外して、setPreferredSize呼び出しを削除する必要があります。 prototype_panelの北の端を揃えることで

layout.putConstraint(NORTH, prototype_panel, 4, SOUTH, paint); 

layout.putConstraint(NORTH, prototype_panel, 4, NORTH, paint); 

あなたはおそらく書くためのもの:

あなたが期待する結果を取得されていません理由は、このラインにおそらくありますペイントの北端には西端とコンテナの西端を合わせて重なっていました。

SpringLayoutは使いにくいです。私の意見では、別のレイアウト、またはレイアウトの組み合わせを使う方が良いでしょう。お互いに多くのパネルを入れ子にするのは間違いありません。あなたのケースでは

、私はあなたがボックスのインスタンスを使用して同じレイアウトを達成している可能性が信じている:

Box radioButtons = Box.createHorizontalBox(); 
radioButtons.add(paint); 
radioButtons.add(select); 

Box panels = Box.createHorizontalBox(); 
panels.add(prototype_panel); 
panels.add(selection_panel); 

Box windowContents = Box.createVerticalBox(); 
windowContents.add(radioButtons); 
windowContents.add(panels); 

setLayout(new BorderLayout()); 
add(windowContents); 

それははるかに短くはないが、それは読んで理解するためにはかなり簡単です。

なぜ、幅と高さがゼロになっているのかについては、検証が行われる前に好ましいサイズを印刷しているとしか思えません。 SpringLayoutコードを使用しても、TileViewパネルをJFrameに追加してpack()を呼び出すと、幅と高さがゼロになることはありませんでした。

関連する問題