如何不提供不会呈现粗体的字体或强制它变为粗体

How to either not provide a font that won't render bold or force it to be bold

我有一个缩放功能,可以调整 row/column 标签的字体大小以匹配显示的 grid/image。与悬停单元格对应的 row/column 标签为粗体,所有其他标签为普通标签。但是,有时悬停的水平行标签会显得平淡,即使相同大小的垂直列标签显示为粗体。

我已经进行了一些测试,并确定在某些标准字体大小(12、18、24 等)下,某些字体(例如 Courier)会出现这种情况,而其他字体(例如 Helvetica Neue)不会出现这种情况.对于所有字体,包括有问题的字体,奇怪的字体大小都按预期加粗。即使字体没有显示为粗体,当我调用 myfont.isBold() 时,它 returns 为真。

我在这里的评估是,对于某些字体,例如我的 courier 版本,当字体大小是直接从字体库提供的大小时,粗体版本的字体不可用,因此字体默认为普通。对于奇怪的字体大小,或者当字体垂直呈现时,将应用程序化的粗体样式。

我说的对吗?如果是这样,我如何才能捕捉到这种情况正在发生或将要发生,并且要么不将该字体作为可用字体提供,要么强制字体在问题大小(例如 12)下呈现为粗体?

这是一个工作示例:

import java.awt.*; 

public class Test {
    public static void main ( String[] args ) {
        class helloFrame extends Frame {
            public void paint( Graphics g ) {
                final Graphics2D g2d = (Graphics2D) g;
                g2d.setFont(new Font("Courier",Font.BOLD,12));
                System.out.println("Style is [" + (g2d.getFont().isBold() ? "bold" : "not bold") + "].");
                g2d.drawString("Hello", 10, 40 );
                g2d.setFont(new Font("Courier",Font.BOLD,13));
                System.out.println("Style is [" + (g2d.getFont().isBold() ? "bold" : "not bold") + "].");
                g2d.drawString("Hello", 10, 55 );
                g2d.setFont(new Font("Courier",Font.BOLD,17));
                System.out.println("Style is [" + (g2d.getFont().isBold() ? "bold" : "not bold") + "].");
                g2d.drawString("Hello", 10, 70 );
                g2d.setFont(new Font("Courier",Font.BOLD,18));
                System.out.println("Style is [" + (g2d.getFont().isBold() ? "bold" : "not bold") + "].");
                g2d.drawString("Hello", 10, 85 );
                g2d.setFont(new Font("Courier",Font.BOLD,19));
                System.out.println("Style is [" + (g2d.getFont().isBold() ? "bold" : "not bold") + "].");
                g2d.drawString("Hello", 10, 100 );
            }
        }

        helloFrame frm = new helloFrame();
        frm.setSize(150,120);
        frm.setVisible(true);
    }
}

打印:

Style is [bold].
Style is [bold].
Style is [bold].
Style is [bold].
Style is [bold].

对于每张印刷品,即使字体对于 12 和 18 号字体没有显示为粗体:

更新:看来这个问题是 OS 特有的。非粗体文本在 Mac 上很明显,但在 Windows.

上一切正常

尝试添加:

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                     RenderingHints.VALUE_ANTIALIAS_ON);

这会打开抗锯齿功能(至少在我的系统上)大大改善了字体渲染并且所有尺寸都显示为粗体。