【问题标题】:Drawing text in java, Look and Feel problems在java中绘制文本,外观问题
【发布时间】:2011-11-16 18:31:31
【问题描述】:

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

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing fonts look-and-feel jtogglebutton


【解决方案1】:

如果您要覆盖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();

我在这篇帖子中被警告 - How to set text above and below a JButton icon? - 这不适用于所有平台和 LAF。该评论还提供了有关如何绘制文本的建议解决方案。

【讨论】:

  • 我将如何将 JLabel 绘制到 BufferedImage(正如 Kleopatra 在您的链接帖子中所建议的那样)?
  • 您可以使用Screen Image 类。只是想知道您是否尝试过我建议的代码?你有问题吗?
  • 在我的代码中发现了一个错误;您发布的代码确实有效!现在我只需要正确定位文本就可以了。感谢您的帮助!
  • ...我得到了它应该在的文本。再次感谢!
  • 您使用的是什么 LAF 和平台?我想跟踪这段代码何时有效,何时无效。另外,您是否放大了绘制的文本以确保它完全一样?
【解决方案2】:

这个问题类似并提供答案:How do I get the default font for Swing JTabbedPane labels?

我不太确定关键是什么,但按照这个答案你可能想尝试一下:

UIManager.getLookAndFeelDefaults().getFont("ToggleButton.font");

编辑

这不是来自链接问题的 sn-p,但经过少量测试后,它似乎等同于:

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 您是否使用 Metal 作为这个项目的外观和感觉?
  • 是的,但我不确定那将永远是 LaF。我也试过 g2d.setFont(MetalLookAndFeel.getControlTextFont()); ,但没有改善。
  • @bendicott 如果您不会一直拥有 MetalLaF,那么无论如何都没有理由这样明确地称呼它。
  • @bendicott 检查我的第二次编辑,应该可以解决您的问题。
猜你喜欢
  • 2012-05-02
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
相关资源
最近更新 更多