2013-04-29 17 views
10

Qualcuno sa come ottenere JTextArea per visualizzare un font di dimensioni fisse su tutte le piattaforme?Acquisire JTextArea per visualizzare caratteri a larghezza fissa senza antialiasing

Desidero creare un semplice editor di codice con funzionalità di salvataggio/apertura, , che è abbastanza semplice, ma mi piacerebbe che il font sia di dimensioni fisse, preferibilmente nuovo di corriere.

Il problema è che Courier New è proprietario a quanto pare, e non solo non è installato di default su molti sistemi, ma nella maggior parte dei sistemi moderni, è impostato per ClearType essere di default, il che rende apparire come spazzatura .

sono tentato di fare le mie JPanel con update-render-vernice e reinventare la JTextArea, e salvare i font come bitmap di dimensione fissa, ma questo approccio sembra stupido, e molto tempo.

Vorrei includere un carattere di dimensione fissa gratuito per il progetto e utilizzare quel tipo di carattere su tutte le piattaforme, che sembra possibile. Tuttavia, i sistemi moderni sembrano forzare tutti i tipi di carattere, cosa che vorrei fare a per impedirne l'esecuzione.

Purtroppo, sembra che Swing risponda automaticamente alle preferenze di sistema così senza distruggere le impostazioni dell'utente, sembra essere un no go.

Così, in breve, v'è un modo per ottenere JTextArea per visualizzare un carattere larghezza fissa e carattere disabilitare levigatura/antialiasing (o almeno toggle), o questo compito impossibile con oscillazione?

Grazie in anticipo!

risposta

23

È possibile utilizzare il carattere logico "monospaziato". Mentre garantisce di avere un font che ha le stesse dimensioni per tutti i personaggi, non sarà lo stesso su tutta la piattaforma.

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

    } 

} 

In alternativa, si potrebbe cercare un font "libero" che soddisfa le vostre esigenze, incorporare il font con il codice e caricarlo con java.awt.Font.createFont(int, InputStream).

+0

Grazie, questo risponde alla domanda, ma sono ancora curioso di sapere se posso fare in modo che il font monospazio garantisca che non sarà antialias. È possibile? – Dmitry

+0

@Dmitry Esistono diversi modi per disabilitare l'anti-aliasing: 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) È possibile impostare RenderingHints sull'oggetto 'Graphics' del metodo' paintComponent' per disabilitare TEXT_ANTI_ALIASING ('((Graphics2D) g) .setRenderingHint (RenderingHints.KEY_TEXT_ANTIALIASING, Boolean.FALSE); 'ma non avrai la garanzia assoluta che qualcuno non cambierà quello dopo. –

+0

Non sono preoccupato per il cambio afterwords, sono preoccupato per le impostazioni di default :). Molte grazie! – Dmitry

1

mi è venuto vicino a una soluzione utilizzando JTextPane invece di JTextArea impostando il tipo di contenuto del JTextPane per text/html e impostare il testo come un contenuto html.

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 sta facendo il testo spaziatura fissa e tutti gli spazi bianchi e caratteri di nuova riga del text hanno sostituito con html e space entity<br> tag, rispettivamente. Ho testato l'output in entrambi i sistemi operativi Windows e Ubuntu ed erano identici.