Sam*_*chi 6 java swing java-2d text-rendering java-7
我正在使用桌面Java应用程序,并且已经使用JDK 6通过IDE进行开发.我使用渲染提示VALUE_FRACTIONALMETRICS_ON和其他提示来更好地渲染JLabel中的文本.这些提示在JVM 1.6上运行得非常漂亮,但我最近注意到,VALUE_FRACTIONALMETRICS_ON当我使用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);
}
};
Run Code Online (Sandbox Code Playgroud)
FRACTIONALMETRICS对文本具有最明显的视觉效果,因此让我的工作就是我想要做的.
这是一个屏幕截图比较,当我从我的IDE(左)运行应用程序时使用Java 6,当我双击Jar文件时,它自己(右)使用我的系统JRE,Java 7.(我还临时添加红色边框以显示paint方法确实有效)
任何帮助将非常感谢.
一般情况下无需设置VALUE_FRACTIONALMETRICS_ON。尝试使用提供的桌面提示。您还可以仔细检查 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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1108 次 |
| 最近记录: |