2009-03-18 2 views
4

私はJButtonを持っていて、実際に割り当てられた文字列に関係なく8 "M"文字列に収まる大きさにしたいとしますそれと、フォントサイズ、elipsisを使用せずに。JButtonが指定された長さの文字列に収まることを保証する

JButtonは正確にこのサイズを持つ必要があります。使用中のレイアウトマネージャはGridBagLayoutです。

getPreferredSize()メソッドを上書きし、システムの文字列と現在のフォントを使用して計算を実行しようとしました。計算は私にいくつかの賢明な価値を戻しますが、私はどのように境界が考慮されるようなやり方で好ましいサイズを設定するか分かりません。

コンポーネントのインセットを取得しようとしましたが、すべて0です。

これは私のメソッドのコードです:

public void getPreferredSize() { 
     Dimension d = super.getPreferredSize(); 

     // Geometry width indicates how many characters must fit 
     char[] pad = new char[propGeometryWidth]; 
     Arrays.fill(pad, 'M'); 
     String tmpTemplateString = new String(pad); 

     FontMetrics tmpMetrics = getFontMetrics(getFont()); 
     Rectangle2D tmpR2D = tmpMetrics.getStringBounds(tmpTemplateString, getGraphics()); 

     int tmpWidth = (int)tmpR2D.getWidth(); 
     int tmpHeight = (int)(tmpR2D.getHeight() * propGeometryHeight + tmpR2D.getHeight()); 

     // We need to take into consideration borders and padding! 
     Insets insets = getInsets(); 

     Dimension tmpSize = new Dimension(tmpWidth + insets.left + insets.right, tmpHeight + insets.top + insets.bottom); 
     return tmpSize; 
} 

私はこれが私のコンポーネントがまだ実現されていないという事実に関係するかもしれないという感覚を得るが、私は、私はこの問題を解決することができるか完全にわかりませんよ。間違った視点からこの問題に近づいていますか?

答えて

2

私は実際にあなたが実際にそれをやっているかもしれないと思います。 Javadoc for getInsets()

このコンポーネントにボーダーが設定されている場合は、ボーダーのインセットを返します。それ以外の場合はsuper.getInsetsと呼び出します。私にとって

新しく作成されたJButtonデフォルトの表情でjava.awt.Insets[top=5,left=17,bottom=5,right=17]のインセットを示し、感じ、およびWindowsルックアンドフィールを持つjava.awt.Insets[top=4,left=16,bottom=4,right=16]。おそらくカスタムルックアンドフィールを使用していますか?

1

私の問題の原因が見つかりました。問題は、内部にJButtonを持つパネルがあり、パネル上にメソッドを上書きしたことです(比較的複雑なクラス階層があります)。もちろん、Panelのインセットはすべて0に設定されています。ボタンのインセットを取得した後は、Mmyers氏の説明どおり、すべてがうまくいきます。