ダイアログのタイトルと使用しているフォントがネイティブリソースであるため、間違った結果が得られます。
アプリケーションが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ソースコードにあります。