简体   繁体   中英

Why are fonts in java 1.7 different to 1.6?

I've been building a development environment in Java (as a small research project). As part of that, I built a custom text component that draws the text itself using Graphics2d like so:

g2.drawString("some text", 100, 100);

Everything worked fine developing things in Eclipse using 1.6 (I assume this is provided by Apple), until I packaged everything up and ran in java 1.7 (provided by Oracle). Obviously in development environments fonts are pretty important, so I was displeased to see the results in 1.7.

在此输入图像描述

I have tried packaging custom fonts, but they all appear grainy and eroded. The comparison above isn't too bad, but some fonts (like Monaco) look terrible.

I'm guessing this is to do with how Apple hooks things into Quartz. But is there any way to improve things so it doesn't look terrible on other systems? Does anyone have a strategy for this?

Update: This is the comparison in Monaco: 在此输入图像描述

and a zoomed comparison of the C (in paintComponent) in Monaco (1.7 on left, 1.6 on right). Note that I am loading the font from a local ttf file using:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("monaco.ttf");
Font customFont = null;
try
{
customFont = Font.createFont(Font.TRUETYPE_FONT, is);
customFont = customFont.deriveFont(16.0f).deriveFont(Font.BOLD);
                    is.close();
                    ge.registerFont(customFont);
                } catch (FontFormatException e1)
                {
                    e1.printStackTrace();
                } catch (IOException e1)
                {
                    e1.printStackTrace();
                }
this.setFont(customFont);

在此输入图像描述

Note also that anti aliasing is turned on using:

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

Java 6 was developed by Apple. Apple put a lot of work into the graphics layer to make it work with Quartz/Cocoa and especially to make it look good.

For Java 7, the development was taken over by Oracle. This doesn't mean that Oracle got the sources from Apple. Instead, they started over (probably porting some Unix code to OS X). This means all the work that Apple put into making Java look good on OS X was basically lost.

Apple cares a lot about design. Oracle ... well ... not so much ( exhibit A , exhibit B )

What can you do?

  • Write and submit a patch to the OpenJDK.
  • Get enough people who care to ask Apple to submit a patch (money might help).
  • Go back to Java 6
  • Use JNI to access Cocoa/Quartz directly so you get the OS X font rendering engine.

Related articles:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM