23

私は自分のレイアウトJDialogをJavaに移植しているプログラムの特定の外観に合わせようとしていますが、以前はいくつかのLayoutManagerを使用して大成功を収めましたが、何らかの理由でこれを取得できないようです。まったく働いています。私の目標は、包含の右側(東)側にJDialog「次を検索」ボタンと「キャンセル」ボタンを上から下の順序で含め、次に下に余分なスペースを入れて、2つのボタンが常に上部にくるようにすることですJDialog。何らかの理由BoxLayoutで、の幅を変更しようとする試みを継続的に無視しています(これは私が失われた場所です)JButton。コードは次のとおりです。

JButton findNext = new JButton("Find Next");
JButton cancel = new JButton("Cancel");
cancel.setPreferredSize(new Dimension((int)findNext.getPreferredSize().getWidth(),  
    (int)cancel.getPreferredSize().getHeight()));

JPanel example = new JPanel();  
example.setLayout(new BoxLayout(example, BoxLayout.Y_AXIS));  
example.add(findNext);
example.add(cancel);  
example.add(Box.createGlue());  

何を試しても、cancel常に通常のサイズを維持します。私は運がなかったのsetMinimumSize()setMaximumSize()同じパラメータで試してみました。setPreferredSize私も試しましcancel.setPreferredSize(new Dimension(500, 500));たが、ボタンの高さだけが調整されましたが、それでもデフォルトの幅が維持されていました。

質問を解決するために、次のように表示されます(これで完了です)。[次を検索]ボタンと[キャンセル]ボタンのサイズが同じではないことがわかります。

サンプル画像

4

6 に答える 6

53

私はこれが古い質問であることを知っていますが、私は本当に良い説明を見ていません。それで、これにつまずく検索者のために、私は私の2セントを追加します。

Swingのコンポーネントのサイズ設定に関連するメソッドは、setPreferredSize()、setMinimumSize()、およびsetMaximumSize()の3つです。ただし、重要な点は、これらのメソッドのいずれかを受け入れるかどうかは、使用されている特定のレイアウトマネージャー次第であるということです。

BoxLayout(元のポスターが使用しているレイアウト)の場合:

  • setMinimumSize()-BoxLayoutこれを尊重します
  • setMaximumSize()-BoxLayoutこれを尊重します
  • setPreferredSize()-X_AXISが使用されている場合は幅が尊重され、Y_AXISが使用されている場合は高さが尊重されます

OPはY_AXISBoxLayoutを使用しているため、高さのみが変更されていました。

更新:すべてのレイアウトマネージャーについて、これと同じ情報を含むページをまとめました。うまくいけば、それは一部の検索者を助けることができます:http: //thebadprogrammer.com/swing-layout-manager-sizing/

于 2011-05-12T16:40:20.723 に答える
9

「コンテナ内の余分なスペースを吸収するために必要に応じて大きくBox.createGlue()なる」、は望ましくない場合があります。代わりに、以下およびこのシミュレーションのに示すように、ボタンの間で使用します。Box.createVerticalStrut() ControlPanel

example.setLayout(new BoxLayout(example, BoxLayout.Y_AXIS));
example.add(findNext);
Box.createVerticalStrut(10);
example.add(cancel);

補遺:

追加するsetMaximumSize()と機能しました。

これは、ボックスレイアウト機能BoxLayoutで説明されているように、垂直方向に同じ最大幅を持つコンポーネントで予想される動作です。コンテナの優先幅は(同じ幅の)子の幅になり、Xの配置は無関係になります。

example.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JButton findNext = new JButton("Find Next");
JButton cancel = new JButton("Cancel");
Dimension d = findNext.getMaximumSize();
cancel.setMaximumSize(new Dimension(d));
example.add(findNext);
example.add(cancel);
于 2010-09-12T00:18:02.810 に答える
3

質問へのコメントで述べたように、に切り替えることで修正することができましたsetMaximumSize()。ただし、ご指摘のとおり、setPreferredSize()機能しません。それで、どうしたの?

Swingの多くの場合、を使用するときに実際のコンポーネントサイズを決定するために使用されるプロパティは、BoxLayout多少ランダムです(私の意見では)。コンポーネントのレンダリング方法を決定するとき、SwingはlayoutComponent()レイアウトマネージャーを呼び出します。レイアウトマネージャーは、すべてを配置する場所を特定します。

BoxLayoutの実装には、メソッドに基づいて、に追加する各コンポーネントの幅と高さのオブジェクトをlayoutComponent()作成するメソッドの呼び出しが含まれます。SizeRequirementsJPanelgetMinimum/Preferred/MaximumSize()

後で、方向が(高さは別の方法を使用して計算される)SizeRequirements.calculateAlignedPositions()であるため、各コンポーネントの正しい幅の値を決定する必要があります。BoxLayout.Y_AXISソースからスニペットを取得すると、このメソッドの関連する実装は次のようになります。

for (int i = 0; i < children.length; i++) {
    SizeRequirements req = children[i];
    //...
    int maxAscent = (int)(req.maximum * alignment);
    int maxDescent = req.maximum - maxAscent;
    //...
    int descent = Math.min(totalDescent, maxDescent);
    //...
    spans[i] = (int)Math.min((long) ascent + (long)descent, Integer.MAX_VALUE);
}

totalDescentは使用可能な幅であることに注意してください。したがって、descentは常にに設定されます。これは、から取得されたにmaxDescent基づいています。の値は、後でtoの呼び出しで幅として使用されます。お気づきのように、ここでは関与していません。そのため、この場合、設定しても影響はありません。SizeRequirements.maximumJButton.getMaximumSize()spans[i]JButton.setBounds()getPreferredSize()

于 2010-09-12T03:40:26.980 に答える
0
button.setMaximumSize(getMaximumSize());
于 2013-03-09T10:41:13.123 に答える
0

setMinimumSize()通常、Swingでコンポーネントのサイズを確認する場合は、、、setMaximumSize()SetPrefferedSize()同じ値で呼び出す必要があります。

于 2010-09-12T04:57:48.627 に答える
0

ボタンをGridLayoutパネルに配置すると、同じ幅になります。

于 2017-05-04T21:04:38.003 に答える