FOLLOW ME Twitter Facebook Вконтакте LinkedIn RSS Feed
Browsing articles tagged with " 7u40"

Bug with stringWidth() in JDK 1.7.0_40

Sep 13, 2013
Category: Java

Today I found that JDK 1.7.0_40 has a bug in the strings width calculation for some fonts. The problem easily reproduces with Retina displays. I wrote a test to do this:

import javax.swing.*;
import java.awt.*;

 * @author Konstantin Bulenkov
public class TextWidthTest extends JFrame {
  public TextWidthTest() throws HeadlessException {
    super("Text Width Test in JDK 1.7.0_40");
    setSize(280, 40);
    final String str = "nnnnnnnnnnnnnnnnnnnn.txt";
    JComponent customComp = new JComponent() {
      protected void paintComponent(Graphics g) {
        FontMetrics fm = getFontMetrics(getFont());
        g.fillRect(0, 0, fm.stringWidth(str), fm.getHeight());
        g.drawString(str, 0, fm.getHeight());
    Font font = new Font("Lucida Grande", Font.PLAIN, 12);

  public static void main(String[] args) {
    new TextWidthTest();

I was playing with the test and found out that FontMetrics returns a wrong width for some combinations of symbols and fonts. I decided to have a break after this:


Font rendering: Apple JDK 6 vs Oracle JDK 1.7.0_40

Sep 12, 2013
Category: Java

The Oracle JDK version 1.7.0_40 contains significant changes in font rendering comparing to latest builds of Apple JDK 1.6

Apple JDK with Quartz

Oracle JDK 1.7.0_40

First screenshot was made with Apple JDK. Quartz Graphics Framework enabled by passing as a system property to render text and graphics. Anyway, fonts and colours under Apple JDK with Quartz look so different in java applications comparing to native ones. The good news is that fonts look natively with new Oracle JDK. It uses new approaches to render texts. Unfortunately, OpenGL doesn’t support SubPixel anti-aliasing, so you can have some problems with non-Retina displays.

Also Apple JDK with Quartz modifies colours while rendering and makes them more soft and warm. Look at the difference in backgrounds on the pictures. They have the same background colour… sort of…

Retina support in Oracle JDK 1.7.0_40 and above

Jun 23, 2013
Category: Java

Hi everyone!

A few days ago I installed Oracle JDK (version 1.7.0_40) built especially for early access purposes. So, it’s not the final release. The build contains tons of bug fixes and backports from JDK 8 for AWT/Swing and that was the main point why I started to play with it. As you might have heard, Retina support was one of the major issues in all 1.7.* releases. I’d say there was no Retina support before the build 1.7.0_40. I’m going to show you some differences of Retina support in Apple and Oracle JDKs.

1. isRetina() method

That’s funny, but there is no public API for it in Oracle JDK 7. Here is how we (IntelliJ IDEA team) do it under Apple JDK:

class IsRetina {
  public static final boolean isRetina = isRetina();

  private static boolean isRetina() {
    try {
      final boolean[] isRetina = new boolean[1];
      new apple.awt.CImage.HiDPIScaledImage(1,1,BufferedImage.TYPE_INT_ARGB) {
        public void drawIntoImage(BufferedImage image, float v) {
          isRetina[0] = v > 1;
      return isRetina[0];
    } catch (Throwable e) { 
      return false;

Continue reading »