ja robię tak
int width=0;
//poniższy kod powtarzam dla każdej kolumny td
int l=M.ilePixeli(10,"o",true);
td.setPreferredWidth(l);
width+=l+2;
//na końcu
tabela.doLayout();
Dimension d=tabela.getPreferredScrollableViewportSize();
d.width=width;
tabela.setPreferredScrollableViewportSize(d);
mam kilka odmian funkcji ilePixeli(), poniżej dwie z nich
M (czytaj Moje funkcje uniwersalne) to klasa z "funkcjami globalnymi", tzn. z metodami static
public static int ilePixeli(FontMetrics fm,int ileZnakow,String str)
{
StringBuffer s=new StringBuffer("");
for (int i=0;i<ileZnakow;i++)
{
s.append(str);
}
return fm.stringWidth(s.toString());
}
//------------------------
public static int ilePixeli(int ileZnakow,String str,boolean pogrub)
{
JLabel prototyp=new JLabel("Prototyp");
Font f=prototyp.getFont();
if(pogrub)
{
f=f.deriveFont(Font.BOLD);
}
FontMetrics fm=prototyp.getFontMetrics(f);
return ilePixeli(fm,ileZnakow,str);
}
pewnie można prościej, ale napisałem parę lat temu, działa i nie chce mi się upraszczać