2013-04-29 10 views
10

Weiß jemand, wie JTextArea eine Schriftart auf allen Plattformen erhalten kann?JTextArea kann Schriftart mit fester Breite ohne Antialiasing anzeigen

Ich möchte einen einfachen Code-Editor mit speichern/öffnen Funktionalität, , die einfach genug ist, aber ich möchte Schriftart zu feste Größe, vorzugsweise Kurier neu sein.

Das Problem ist, dass Kurier neue proprietäre ist offensichtlich, und nicht nur ist es nicht standardmäßig auf vielen Systemen installiert, aber auf den meisten modernen Systemen wird es auf Cleartype-Standard sein, was es wie Müll aussehen lässt .

Ich bin versucht, mein eigenes JPanel mit update-Render-Lack und neu zu erfinden, die JTextArea zu machen und Schriftarten als feste Größe Bitmaps speichern, aber dieser Ansatz scheint dumm und sehr zeitaufwendig.

Ich möchte eine kostenlose Schriftart fester Größe in das Projekt und verwenden Sie diese Schriftart auf allen Plattformen, die möglich erscheint. Allerdings scheinen moderne Systeme alle Schriftarten zu glätten, was ich gerne verhindern würde.

Leider scheint Swing automatisch durch Systemvorgaben so, ohne die Einstellungen des Benutzers zu zerstören, scheint es ein Nein zu sein.

kurz So ist es eine Möglichkeit, JTextArea zu bekommen eine feste Breite Schriftart und Schriftglättung deaktivieren/Anti-Aliasing (oder zumindest Toggle) anzuzeigen, oder ist diese Aufgabe unmöglich Swing mit?

Vielen Dank im Voraus!

Antwort

23

Sie können die logische Schriftart "monospaced" verwenden. Während garantiert wird, dass eine Schriftart die gleiche Größe für alle Zeichen hat, ist sie nicht auf allen Plattformen gleich.

import java.awt.Font; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

public class TestTextArea { 

    private void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JTextArea textArea = new JTextArea(24, 80); 
     textArea.setFont(new Font("monospaced", Font.PLAIN, 12)); 
     frame.add(new JScrollPane(textArea)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestTextArea().initUI(); 
      } 
     }); 

    } 

} 

Alternativ können Sie eine „freie“ font nachschlagen, die Ihren Bedarf erfüllt, einbetten, die mit Code-Schriftart in und mit java.awt.Font.createFont(int, InputStream) laden.

+0

Danke, das beantwortet die Frage, aber ich bin immer noch neugierig, wenn ich die monospaced Schriftart sicherstellen kann, dass es nicht antialiased wird. Ist das möglich? – Dmitry

+0

@Dmitry Es gibt mehrere Möglichkeiten, das Anti-Aliasing zu deaktivieren: 1) ['System.setProperty (" awt.useSystemAAFontSettings "," false ");'] (http://docs.oracle.com/javase/6/docs /technotes/guides/2d/flags.html#aaFonts) 'System.property (" swing.aatext "," false "); 2) Sie können die RenderingHints auf das Graphics-Objekt der 'paintComponent'-Methode setzen, um TEXT_ANTI_ALIASING zu deaktivieren (' ((Graphics2D) g) .setRenderingHint (RenderingHints.KEY_TEXT_ANTIALIASING, Boolean.FALSCH); "aber du wirst keine absolute Garantie haben, dass jemand das später nicht ändern wird. –

+0

Ich mache mir keine Sorgen über Änderungen nach, ich mache mir Sorgen über die Standardeinstellungen :). Danke vielmals! – Dmitry

1

Ich kam in der Nähe zu einer Lösung von JTextPane statt JTextArea durch den Inhaltstyp der JTextPane zu text/html Einstellung und Einstellung des Textes als html Inhalt verwenden.

JtextPane textPane; 
String text; 

// initialization 

textPane.setContentType("text/html"); 
textPane.setText("" 
     + "<html>" 
     + "<body>" 
     + "<p>" 
     + "<tt>"+text.replaceAll(" ", "&nbsp;").replaceAll("\n", "<br>")+"</tt>" 
     + "</p>" 
     + "</body>" 
     + "</html>"     
     + ""); 

<tt> Tag macht den Text dicktengleiche und alle weißen Flächen und neue Zeile Zeichen des text haben mit html ersetzt space entity und <br> Tag sind. Ich habe die Ausgabe sowohl in Windows als auch in Ubuntu getestet und sie waren identisch.