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 回答