如何不提供不会呈现粗体的字体或强制使用粗体

时间:2015-11-20 17:07:50

标签: java swing fonts graphics2d

我有一个缩放功能,可以调整行/列标签的字体大小以匹配显示的网格/图像。对应于悬停的单元格的行/列标签是粗体,所有其他标签都是纯的。但是,即使相同大小的垂直列标签显示为粗体,有时悬停的水平行标签也会显示为正常。

我已经完成了一些测试,并确定某些字体(例如Courier)的某些标准字体大小(12,18,24等)发生了这种情况,而其他字体(例如Helvetica Neue)则没有。对于所有字体,包括有问题的字体,奇数字体大小按预期加粗。即使字体没有显示为粗体,当我调用myfont.isBold()时,它也会返回true。

我的评估是,对于某些字体,例如我的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:

enter image description here

更新:此问题似乎是特定于操作系统的。非粗体文本在Mac上很明显,但在Windows上显示的一切都是正确的。

1 个答案:

答案 0 :(得分:2)

尝试添加:

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

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