2

内部にいくつかのコンポーネントを含む JDialog があります。ダイアログをできるだけ小さくしたい。現在、pack() を使用しています。これにより、ダイアログの幅が狭まりすぎて、タイトルが完全に表示されなくなるという意図しない効果があります。タイトルが常に完全に表示されるように、ダイアログの幅を常に十分に大きくしたいと考えています。

スイングを使用しています。タイトル バーの外観/フォントは OS によって決定されることを認識しています。私はスイングに固執したいので、現時点では、JLabel のフォントに基づいてタイトル文字列の幅を計算することを計画しています。次に、コンポーネントの 1 つの最小幅をそれに等しく設定します。

タイトルを表示したまま JDialog をパックするより良い方法はありますか?

4

2 に答える 2

6
 public static void adjustWidthForTitle(JDialog dialog)
{
    // make sure that the dialog is not smaller than its title
    // this is not an ideal method, but I can't figure out a better one
    Font defaultFont = UIManager.getDefaults().getFont("Label.font");
    int titleStringWidth = SwingUtilities.computeStringWidth(new JLabel().getFontMetrics(defaultFont),
            dialog.getTitle());

    // account for titlebar button widths. (estimated)
    titleStringWidth += 110;

    // set minimum width
    Dimension currentPreferred = dialog.getPreferredSize();

    // +10 accounts for the three dots that are appended when the title is too long
    if(currentPreferred.getWidth() + 10 <= titleStringWidth)
    {
        dialog.setPreferredSize(new Dimension(titleStringWidth, (int) currentPreferred.getHeight()));

    }
}

編集:リンクのtrashgodの投稿を読んだ後、getPreferredSizeメソッドをオーバーライドするようにソリューションを調整しました。この方法は、以前の静的メソッドよりも優れていると思います。静的メソッドを使用して、pack() サンドイッチで調整する必要がありました。パック()、調整()、パック()。このwasyは、pack()で特別な考慮を必要としません。

JDialog dialog = new JDialog()
    {
        @Override
        public Dimension getPreferredSize()
        {
            Dimension retVal = super.getPreferredSize();

            String title = this.getTitle();

            if(title != null)
            {
                Font defaultFont = UIManager.getDefaults().getFont("Label.font");
                int titleStringWidth = SwingUtilities.computeStringWidth(new JLabel().getFontMetrics(defaultFont),
                        title);

                // account for titlebar button widths. (estimated)
                titleStringWidth += 110;

                // +10 accounts for the three dots that are appended when
                // the title is too long
                if(retVal.getWidth() + 10 <= titleStringWidth)
                {
                    retVal = new Dimension(titleStringWidth, (int) retVal.getHeight());
                }
            }
            return retVal;
        }

    };
于 2012-09-20T17:38:15.357 に答える
1

1)FontMetricsタイトルの幅を調べるために使用します

2)この値に、ウィンドウアイコンとX(閉じる)ボタンを表す数値を追加します(推測する必要があります)。

3)上記の値でダイアログの幅を設定します。

必要な正確な幅のサイズを見つけることはできませんが、これは適切な推測を行う方法です。

于 2012-09-20T17:24:49.613 に答える