1

ダイアログのタイトル幅を計算するために使用される次のコードがあります。

FontRenderContext frc = new FontRenderContext(null, true, true);
TextLayout tl = new TextLayout(getTitle(), getFont(), frc);
double w = tl.getPixelBounds(null,  0, 0).getWidth();

ただし、何らかの理由でテキスト幅が正しく計算されません。ラジオ ボタン ラベルのテキスト幅を計算するためにこのコードをチェックしたところ、正しく機能しました。私の主な関心事は、ダイアログのフォントです。正しく取得できるかどうかはわかりません。

たとえば、タイトルのtest計算された幅は20実際の幅です23。文字列が長いほど、計算された幅と実際の幅の差が大きくなります。

4

1 に答える 1

5

ダイアログのタイトルと使用しているフォントがネイティブリソースであるため、間違った結果が得られます。

アプリケーションがWindowsのみの場合は、次のコードで幅を取得できます。

Font f = (Font)Toolkit.getDefaultToolkit().getDesktopProperty("win.frame.captionFont");  
Graphics gr = getGraphics();  
FontMetrics metrics = gr.getFontMetrics(f);  
int width = metrics.stringWidth(getTitle());  

それ以外の場合は、タイトルバーのフォントからFontMetricsを取得してみてください。

Container titleBar = (Container) dialog.getLayeredPane().getComponents()[1];
FontMetrics metrics = titleBar.getFontMetrics(titleBar.getFont());
int width = metrics.stringWidth(getTitle());

ダイアログの幅を動的に設定する場合は、LaFの間隔と境界線も考慮する必要があります。これを試して:

// This is the space inserted on the left of the title, 5px in Metal LaF
width += 5; 

// This is the space for the close button, LaF dependent.
width += 4;

// Add the borders
width += dialog.getWidth() - dialog.getContentPane().getWidth();

// Finally set the size
dialog.setSize(new Dimension(width, dialog.getPreferredSize().height));

うまくいけば、これはうまくいくでしょう。数字がどこから来ているのか疑問に思われる場合は、JDKソースコードにあります。

于 2012-07-03T11:47:50.610 に答える