0

現在は常に (0, 0) であるため、SpringLayout を使用して JPanel の優先サイズを適切に計算する方法がわかりません。に電話してみましたがpanel.setPreferredSize(layout.preferredLayoutSize(panel));、何も変わりません。また、最も南/東にあるコンポーネントと比較して、パネルの南側と東側に制約(以下のコードでコメントアウト)を配置しようとしましたが、適切な優先サイズが得られ始めますが、JFrameのサイズを変更するとGUIが完全にめちゃくちゃになります(たとえば、一部のコンポーネントがビューの外に移動したり、互いに重なり合ったりするなど)。

これは私に問題を与えているクラスです:

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)); 

    }

}
4

1 に答える 1

3

SpringLayout は問題なく動作しています。あなたは最初から正しかった。最後の 2 つの putConstraint 呼び出しのコメントを外し、setPreferredSize 呼び出しを削除する必要があります。

期待する結果が得られない理由は、おそらく次の行が原因です。

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

おそらく次のように書くつもりでした:

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

コンテナの西端に両方の西端を合わせながら、prototype_panel の北端を paint の北端に揃えることで、それらをオーバーラップさせました。

SpringLayout は使いにくいです。私の意見では、別のレイアウトまたはレイアウトの組み合わせを使用する方がよいでしょう。多くのパネルを互いに入れ子にしても問題はありません。

あなたの場合、Box インスタンスを使用して同じレイアウトを実現できたと思います。

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() を呼び出すと、幅と高さがゼロになることはありませんでした。

于 2016-07-05T01:03:34.663 に答える