在Java中绘制文本,外观和感觉问题

4

我重写了一个扩展的JToggleButton的paintComponent方法,以便在按钮被切换时使用TexturePaint填充文本。我遇到的问题是,我似乎无法使用与我的外观和感觉默认使用的相同字体绘制文本。我尝试过g2d.setFont(this.getFont());,其中"this"是我正在使用的按钮。字体很接近,但在绘制时看起来比默认文本更加粗体。有没有更好的方法来绘制文本,使其看起来与默认文本相同,除了颜色?提前致谢!


为了更快地获得更好的帮助,请发布一个SSCCE - Andrew Thompson
2个回答

4

如果你正在重写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。评论中还提供了一种建议的解决方案来绘制文本。


我该如何将JLabel绘制到BufferedImage中(正如Kleopatra在您链接的帖子中建议的那样)? - bendicott
您可以使用 Screen Image 类。只是好奇地问一下,您是否尝试了我建议的代码?有什么问题吗? - camickr
发现了我的代码中的一个错误;你发布的代码确实有效!现在我只需要正确地定位文本,就可以继续了。感谢你的帮助! - bendicott
我已经把文本放到了它应该在的位置。再次感谢! - bendicott
你正在使用哪个LAF和平台?我想要跟踪这段代码什么时候工作,什么时候不工作。另外,你是否放大绘制的文本以确保它完全相同? - camickr
显示剩余2条评论

3
这个问题与以下问题类似并提供了答案:如何获取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));

比起其他按钮,这个按钮还是更加醒目,可惜。 - bendicott
@bendicott 你在这个项目中使用Metal作为你的外观吗? - Brandon Buck
如果您不总是有MetalLaF,那么无论如何都没有理由显式地调用它。 - Brandon Buck
@bendicott,请检查我的第二次编辑,那应该解决你的问题。 - Brandon Buck
@bendicott,如果我没有看到你正在做的任何事情,那就是我所能提供的全部了。 - Brandon Buck
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接