拡張された JToggleButton の paintComponent メソッドをオーバーライドして、ボタンが切り替えられたときにテキストに TexturePaint 塗りつぶしを使用できるようにしました。私が直面している問題は、ルック アンド フィールがデフォルトで使用しているフォントと同じフォントを使用してテキストを描画できないように見えることです。g2d.setFont(this.getFont()); を試しました ここで、「これ」は私が使用しているボタンです。フォントは近いですが、描画するとデフォルトのテキストよりも太く表示されます。色を保存して、デフォルトと同じように見えるようにテキストを描画するより良い方法はありますか? 前もって感謝します!
2 に答える
paintComponent() メソッドをオーバーライドしている場合、Graphics オブジェクトはトグル ボタンの Font を持つように構成されているはずです。違いはおそらく、デフォルトではオンになっていないアンチエイリアシングによるものです。
非常に限られたテストで、自分に合ったコードを見つけました。paintComponent() メソッドで次のことを試してください。
Graphics2D g2 = (Graphics2D)g.create();
Toolkit toolkit = Toolkit.getDefaultToolkit();
Map map = (Map)(toolkit.getDesktopProperty("awt.font.desktophints"));
if (map != null)
{
g2.addRenderingHints(map);
}
g2.drawString(...);
g2.dispose();
この投稿で警告を受けました - How to set text above and below a JButton icon? - これはすべてのプラットフォームと LAF で機能するわけではありません。コメントは、テキストをペイントする方法に関する提案された解決策も提供します。
この質問は類似しており、回答を提供します: Swing JTabbedPane ラベルのデフォルト フォントを取得するにはどうすればよいですか?
キーが何であるかはよくわかりませんが、その答えに従って試してみてください:
UIManager.getLookAndFeelDefaults().getFont("ToggleButton.font");
編集
これはリンクされた質問のスニペットではありませんが、少しテストした後、次のものと同等のように見えます:
UIManager.getDefaults().getFont("ToggleButton.font");
これは、リンクされた質問で指定されたコードです。
編集2
私は解決策を見つけたと思います。返されるデフォルトは単なるフォントです。次の行のサンプルでこれを回避しました。
this.setFont(UIManager.getDefaults().getFont("ToggleButton.font").deriveFont(this.getFont().getStyle(), this.getFont().getSize()));
私の提案 (見苦しくないようにするため) は、デフォルトのフォント スタイルとサイズのプライベート プロパティをクラスに追加することです (コンストラクターで設定できます)。
fontStyle = this.getFont().getStyle();
fontSize = this.getFont().getSize();
そして、次の方法でクリーンアップできます。
this.setFont(UIManager.getDefaults().getFont("ToggleButton.font").deriveFont(this.fontStyle, this.fontSize));