如何不提供不会呈现粗体的字体或强制它变为粗体
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);
这会打开抗锯齿功能(至少在我的系统上)大大改善了字体渲染并且所有尺寸都显示为粗体。
我有一个缩放功能,可以调整 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);
这会打开抗锯齿功能(至少在我的系统上)大大改善了字体渲染并且所有尺寸都显示为粗体。