我重写了一个扩展的JToggleButton的paintComponent方法,以便在按钮被切换时使用TexturePaint填充文本。我遇到的问题是,我似乎无法使用与我的外观和感觉默认使用的相同字体绘制文本。我尝试过g2d.setFont(this.getFont());,其中"this"是我正在使用的按钮。字体很接近,但在绘制时看起来比默认文本更加粗体。有没有更好的方法来绘制文本,使其看起来与默认文本相同,除了颜色?提前致谢!
我重写了一个扩展的JToggleButton的paintComponent方法,以便在按钮被切换时使用TexturePaint填充文本。我遇到的问题是,我似乎无法使用与我的外观和感觉默认使用的相同字体绘制文本。我尝试过g2d.setFont(this.getFont());,其中"this"是我正在使用的按钮。字体很接近,但在绘制时看起来比默认文本更加粗体。有没有更好的方法来绘制文本,使其看起来与默认文本相同,除了颜色?提前致谢!
如果你正在重写paintComponent()方法,那么Graphics对象应该已经配置为拥有切换按钮的字体。不同之处可能是因为默认情况下未开启抗锯齿。
我在非常有限的测试中找到了一些适合我的代码。请尝试在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();
我在这篇帖子 如何在JButton图标上下设置文本? 中得到了警告,这种方法并不适用于所有平台和LAF's。评论中还提供了一种建议的解决方案来绘制文本。
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));