2012-12-05 10 views
5

JButtonテキストのフォントサイズを自動的に増減しようとしています(もしJButtonが減少すると、テキストも減少します)。 JButtonsのデフォルトのフォントはSans-Serifサイズ20になり、20以下になることはありません(21,30,40、またはそれ以上の20、ただし20以下の値は決してありません)。私はMenuPanelと呼ばれるJPanelを持っていますが、GridLayoutを使って5つのJButtonを追加し、JPanelが増減するにつれてサイズが増減します。私はGridLayoutをこの目的のために最適なレイアウトのように選んだのですが、間違っていますか?また、MenuResizedをMenuJPanelに追加しました。下に、部分的に動作する私のコードを見ることができます。JButtonのサイズに基づいてJButtonテキストのサイズを自動的に増減させる方法は?

enter image description here

public class MenuJPanel extends JPanel { 

    private JButton resizeBtn1; 
    private JButton resizeBtn2; 
    private JButton resizeBtn3; 
    private JButton resizeBtn4; 
    private JButton resizeBtn5; 

    public MenuJPanel() { 
     initComponents(); 
     this.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent e) { 

       Font btnFont = resizeBtn1.getFont(); 
       String btnText = resizeBtn1.getText(); 

       int stringWidth = resizeBtn1.getFontMetrics(btnFont).stringWidth(btnText); 
       int componentWidth = resizeBtn1.getWidth(); 

       // Find out how much the font can grow in width. 
       double widthRatio = (double) componentWidth/(double) stringWidth; 

       int newFontSize = (int) (btnFont.getSize() * widthRatio); 
       int componentHeight = resizeBtn1.getHeight(); 

       // Pick a new font size so it will not be larger than the height of label. 
       int fontSizeToUse = Math.min(newFontSize, componentHeight); 

       // Set the label's font size to the newly determined size. 
       resizeBtn1.setFont(new Font(btnFont.getName(), Font.BOLD, fontSizeToUse)); 
      } 
     }); 
    } 

    private void initComponents() { 

     resizeBtn1 = new javax.swing.JButton(); 
     resizeBtn2 = new javax.swing.JButton(); 
     resizeBtn3 = new javax.swing.JButton(); 
     resizeBtn4 = new javax.swing.JButton(); 
     resizeBtn5 = new javax.swing.JButton(); 

     setLayout(new java.awt.GridLayout(5, 0)); 

     resizeBtn1.setText("Text to resize 1"); 
     add(resizeBtn1); 

     resizeBtn2.setText("Text to resize 2"); 
     add(resizeBtn2); 

     resizeBtn3.setText("Text to resize 3"); 
     add(resizeBtn3); 

     resizeBtn4.setText("Text to resize 4"); 
     add(resizeBtn4); 

     resizeBtn5.setText("Text to resize 5"); 
     add(resizeBtn5); 
    } 
} 
+3

あなたの問題はあなたがSSCCEを投稿しなかったことです、whats btnOperatorLogout、ここでメインクラスでは、残念な怠惰が私を打ち負かしてしまいました。この単純な問題はこのフォーラムで何度も解決されました。私はDeriveFont &JLabel – mKorbel

+0

ありがとう、私はちょうど例のコードを修正しました – jadrijan

+1

JButtonからのインセットとボーダーのためのマイナス1ピクセルを取得することを意味するJButtonについてのラインを参照してください(選択されている場合、JButtonについての行を参照) SwingUtilities#computeStringWidhtの利用可能なディメンションです:-) – mKorbel

答えて

5

通常、JButtonためButtonUIデリゲートは、設計者の選択したフォントとプラットフォームの美学に基づいて、ボタンの推奨サイズを計算します。あなたのアプローチがこれを打ち負かすと、ボタンでテキストをどのように拡大し、ボタンの装飾に合わせるかはあなた次第です。

独自のButtonUIを作成していない場合は、単純にテキストの縮尺を変更できます。このexampleでは、TextLayoutは、BufferedImageのテキストを、必要に応じて縮小できる任意の大きなサイズでレンダリングするために使用されます。このexampleでは、1桁のグリフがBufferedImageにレンダリングされ、ボタンの現在のサイズに合わせてスケーリングされます。 Iconの相対的な位置に対処する必要がある場合は、hereを調べてSwingUtilities.layoutCompoundLabel()を参照してください。

+0

この回答をありがとうございます。もう1つの質問があります。たとえば、JButtonのテキストにHTMLを使用すると、「 Line1
Line2」と表示されますが、上記の例は引き続き動作しますか? – jadrijan

+0

ありがとう、私はそれを試してみようとあなたに知らせる – jadrijan

+0

私はよく分からない; 'layoutCompoundLabel()'がそれを処理できます。 'JPanel' [編集]の[こちら](http://stackoverflow.com/a/7028497/230513)に示すように、' JLabel'をレンダリングする方が簡単かもしれません。 – trashgod

関連する問題