2013-09-16 6 views
17

Ich habe eine Entwicklungsumgebung in Java gebaut (als kleines Forschungsprojekt). Als Teil davon, baute ich eine benutzerdefinierte Textkomponente, die den Text selbst mit Graphics2D wie so zieht:Warum sind Schriften in Java 1.7 anders als 1.6?

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

Alles hat gut funktioniert Dinge in Eclipse entwickelt 1.6 unter Verwendung von (ich nehme diese von Apple zur Verfügung gestellt wird), bis ich verpackt alles auf und lief in Java 1.7 (von Oracle zur Verfügung gestellt). Offensichtlich sind Schriften in Entwicklungsumgebungen ziemlich wichtig, daher war ich nicht erfreut, die Ergebnisse in 1.7 zu sehen.

enter image description here

Ich habe versucht, benutzerdefinierte Schriftarten verpacken, aber sie alle erscheinen körnig und erodiert. Der obige Vergleich ist nicht schlecht, aber einige Schriften (wie Monaco) sehen schrecklich aus.

Ich vermute, das hat damit zu tun, wie Apple Dinge in Quartz hakt. Aber gibt es einen Weg, die Dinge zu verbessern, damit es auf anderen Systemen nicht schrecklich aussieht? Hat jemand eine Strategie dafür?

Update: Dies ist der Vergleich in Monaco: enter image description here

und ein vergrößertes Vergleich der C (in paintcomponent) in Monaco (1,7 auf der linken Seite, 1.6 rechts). Beachten Sie, dass ich die Schrift von einer lokalen ttf Datei bin Laden mit:

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); 

enter image description here

Beachten Sie auch, dass Anti-Aliasing eingeschaltet werden:

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

Haben sie die gleiche Schriftart verwenden? –

+1

vielleicht verwenden sie eine andere Standardschrift? – JohnnyAW

+1

Ähnliche Fragen hier gestellt: http://superuser.com/questions/112326/why-do-the-fonts-in-the-java-application-im-running-look-different-in-mac-os-x – Goibniu

Antwort

14

Java 6 wurde von Apple entwickelt. Apple hat eine Menge Arbeit in die Grafikebene investiert, damit es mit Quartz/Cocoa funktioniert und besonders gut aussieht.

Für Java 7 wurde die Entwicklung von Oracle übernommen. Das bedeutet nicht, dass Oracle die Quellen von Apple bekommen hat. Stattdessen haben sie von vorne begonnen (wahrscheinlich haben sie Unix-Code auf OS X portiert). Das bedeutet, dass all die Arbeit, die Apple für die Darstellung von Java auf OS X geleistet hat, im Grunde verloren gegangen ist.

Apple kümmert sich sehr um Design. Oracle ... naja ... nicht so viel (exhibit A, exhibit B)

Was können Sie tun?

  • Schreiben und senden Sie einen Patch an die OpenJDK.
  • Erhalten Sie genug Leute, die sich darum kümmern, dass Apple einen Patch einreicht (Geld könnte helfen).
  • Zurück zu Java 6
  • Verwenden Sie JNI, um direkt auf Cocoa/Quartz zuzugreifen, damit Sie die OS X Schriftart-Rendering-Engine erhalten.

In Verbindung stehende Artikel:

+1

+1 Für die zwei Exponate. – arshajii

+0

Interessant. Es macht keinen Sinn, Oracle nicht ihre Implementierung zu geben ... – alistair

+1

@alistair: Aus technischer Sicht hast du recht. Aber Gier versucht IT zu übernehmen (siehe Patent Trolle, die Klagen zwischen Apple und Samsung). Ich denke, Apple würde Oracle eine Kopie geben, wenn Oracle es lizenziert, aber Oracle will nichts lizenzieren, es sei denn, es kann damit Geld verdienen. Wie viel haben Sie für Ihre Kopie von Java 7 bezahlt? Es ist also eine Sackgasse. –

Verwandte Themen