Java)に移植しているプログラムが持っている特定の外観に合うように、私のJDialog
のレイアウトを取得しようとしています。いくつか使用しました。 LayoutManagersは以前は大成功でしたが、何らかの理由でこれをまったく機能させることができないようです。私の目標は、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
は常に通常のサイズを保持します。 setPreferredSize
と同じパラメータでsetMinimumSize()
とsetMaximumSize()
を試しましたが運がありませんでした。 cancel.setPreferredSize(new Dimension(500, 500));
を試したところ、ボタンの高さが調整されただけで、指定されたデフォルトの幅が保持されていました。
質問をクリアするために、次のように表示されます(これで完了です)。[次を検索]ボタンと[キャンセル]ボタンのサイズが同じではないことがわかります。
私はこれが古い質問であることを知っていますが、私は本当に良い説明を見ていません。それで、これにつまずく検索者のために、私は私の2セントを追加します。
Swingのコンポーネントのサイズ設定に関連するメソッドは、setPreferredSize()、setMinimumSize()、およびsetMaximumSize()の3つです。ただし、重要な点は、これらの方法のいずれかを尊重するかどうかは、使用されている特定のレイアウトマネージャー次第であるということです。
BoxLayout(元のポスターが使用しているレイアウト)の場合:
BoxLayout
はこれを尊重しますBoxLayout
はこれを尊重しますOPはY_AXISBoxLayoutを使用しているため、高さのみが変更されていました。
更新:すべてのレイアウトマネージャーについて、これと同じ情報を含むページをまとめました。うまくいけば、それは一部の検索者を助けることができます: http://thebadprogrammer.com/swing-layout-manager-sizing/
「 必要に応じて 成長してコンテナ内の余分なスペースを吸収する」Box.createGlue()
は必要ない場合があります。代わりに、 Box.createVerticalStrut()
betweenボタンを使用してください。以下および 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);
_
質問へのコメントで述べたように、setMaximumSize()
に切り替えることで修正することができました。ただし、ご指摘のとおり、setPreferredSize()
は機能しません。それで、どうしたの?
Swingの多くの場合、BoxLayout
を使用するときに実際のコンポーネントサイズを決定するために使用されるプロパティは、いくぶんランダムです(私の意見では)。コンポーネントのレンダリング方法を決定するとき、SwingはレイアウトマネージャーでlayoutComponent()
を呼び出します。これは、すべてを配置する場所を特定します。
BoxLayout
のlayoutComponent()
の実装には、追加する各コンポーネントの幅と高さのオブジェクトを作成するメソッドの呼び出しが含まれます SizeRequirements
JPanel
、getMinimum/Preferred/MaximumSize()
メソッドに基づく。
後で、方向が_BoxLayout.Y_AXIS
_(高さは別の方法を使用して計算される)であるため、各コンポーネントの正しい幅の値を決定するためにSizeRequirements.calculateAlignedPositions()
を呼び出します。ソースからスニペットを取得すると、このメソッドの関連する実装は次のようになります。
_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
に設定されます。これは、[$ = FUNC @から取得された_SizeRequirements.maximum
_に基づいています。 ]。 _spans[i]
_の値は、後でJButton.getMaximumSize()
の呼び出しで幅として使用されます。お気づきのように、JButton.setBounds()
はここでは関与していません。そのため、この場合、getPreferredSize()
を設定しても影響はありません。
ボタンをGridLayoutパネルに配置すると、同じ幅になります。
通常、Swingでコンポーネントのサイズを確認する場合は、同じ値でsetMinimumSize()
、setMaximumSize()
、およびSetPrefferedSize()
を呼び出す必要があります。