如何在Java7中使用分馏矩阵呈现文本
我有一个正在开发的桌面Java应用程序,一直在使用JDK 6通过IDE进行开发。我使用上的呈现提示如何在Java7中使用分馏矩阵呈现文本,java,swing,java-7,java-2d,text-rendering,Java,Swing,Java 7,Java 2d,Text Rendering,我有一个正在开发的桌面Java应用程序,一直在使用JDK 6通过IDE进行开发。我使用上的呈现提示VALUE\u partialmetrics\u以及其他提示来更好地呈现jlabel中的文本。这些提示在JVM 1.6上运行得很好,但我最近注意到,当我使用JRE 1.7运行应用程序时,它似乎完全忽略了值
VALUE\u partialmetrics\u以及其他提示来更好地呈现jlabel中的文本。这些提示在JVM 1.6上运行得很好,但我最近注意到,当我使用JRE 1.7运行应用程序时,它似乎完全忽略了值
,我是否在这里做了一些错误,使Java 7忽略了这些提示
lblDate = new ATimeLabel(ATimeLabel.DATE_LETTERS) {
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
super.paintComponent(g2d);
}
};
分馏技术在文本上有着最大的显著视觉效果,所以让它发挥作用是我想要做的
下面是一个屏幕截图,比较了当我从使用Java 6的IDE(左)运行应用程序和双击Jar文件本身(右)时(使用我的系统JRE,Java 7)的情况。
(我还临时添加了红色边框,以表明绘制方法确实有效)
非常感谢您的帮助。通常无需在
上设置值。尝试使用提供的桌面提示。您还可以从FontRenderContext中再次检查Swing抗锯齿提示。使用示例如下所示
如果您希望加粗文本(这是分数度量的副作用),我更喜欢使用加粗字体,或者将输出渲染为图像,并在绘制之前将其模糊。这将确保一个独立于系统的解决方案
import java.awt.*;
import java.awt.event.*;
import java.util.Map;
import javax.swing.JLabel;
public class TextHints {
public static void main(String[] args) {
Frame frame = new Frame();
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
JLabel label = new JLabel("Sunday, March 17") {
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Map desktopHints = (Map) Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints");
if (desktopHints != null) {
g2d.addRenderingHints(desktopHints);
System.out.println("Desktop: " + desktopHints);
}
java.awt.FontMetrics fm = getFontMetrics(getFont());
Object swingHint = fm.getFontRenderContext().getAntiAliasingHint();
System.out.println("Swing AntiAliasingHint: " + swingHint);
super.paintComponent(g2d);
}
};
label.setBackground(Color.BLACK);
label.setForeground(Color.LIGHT_GRAY);
label.setOpaque(true);
label.setFont(label.getFont().deriveFont(Font.BOLD, 14f));
frame.add(label);
frame.setSize(new Dimension(160, 100));
frame.setVisible(true);
}
}
这似乎不起作用。我不是想让它变厚,我只是想让它变得锋利和干净。这确实使它看起来像正确的图像。我想让它看起来像左边的图像,这是有点瘦。我正在寻找亚像素的字体渲染。但这似乎只是Java6。。。