2013-06-15

Retro-Spaß mit Schriften

Meine Antwort auf einen Kommentar zum vorangehenden Post hat mich veranlasst, etwas zu spielen. …folgen Sie mir auf einem kleinen (Achtung: Wortwitz) be-Swing-ten Spaziergang in die Vergangenheit. Ziel ist, das folgende Fenster (bzw. seinen Inhalt) wie die Bildschirmausgabe eines Commodore 64 aussehen zu lassen.
Screenshot eines JFrame
Screenshot eines JFrame
Der Java-Quelltext sieht folgendermaßen aus:
 package com.thomaskuenneth;  
 import javax.swing.JFrame;  
 import javax.swing.JScrollPane;  
 import javax.swing.JTextArea;  
 import javax.swing.SwingUtilities;  
 public class C64FontDemo extends JFrame {  
   private static final String CODE = "10 PRINT \"HELLO, WORLD \";\n20 GOTO 10";  
   public C64FontDemo() {  
     super(C64FontDemo.class.getName());  
     JTextArea ta = new JTextArea(CODE);  
     getContentPane().add(new JScrollPane(ta));  
     pack();  
   }  
   public static void main(String[] args) {  
     SwingUtilities.invokeLater(new Runnable() {  
       @Override  
       public void run() {  
         new C64FontDemo().setVisible(true);  
       }  
     });  
   }  
 }  
Hier nun ein Blick auf das (emulierte) Original:
C64 nach dem Systemstart und Eingabe eines kurzen Programms
C64 nach dem Systemstart und Eingabe eines kurzen Programms
Lassen wir das Programm zum Spaß kurz laufen und unterbrechen es dann.
Bildschirmausgaben des Programms
Bildschirmausgaben des Programms
Die markanten Blautöne lassen sich leicht in das Java-Programm übernehmen. Die beiden Methodenaufrufe finden am besten nach dem Erzeugen des Textfeldes ihren Platz.
     ta.setBackground(new Color(0x525ce6));  
     ta.setForeground(new Color(0xb0b3ff));  
Das sieht schon ein wenig echter aus. (Starten können wir es freilich nicht.)
Screenshot: typische Vorder- und Hintergrundfarbe
Screenshot: typische Vorder- und Hintergrundfarbe
Den letzten Schliff erhält das Ganze mit einer Commodore 64-Schrift. Sie können sich mehrere Varianten von style64.org/c64-truetype herunterladen. Nach dem Entpacken müssen Sie den Pfad im folgenden Quelltextschnipsel anpassen. Dieser findet seinen Platz übrigens nicht im Konstruktor der Klasse, sondern innerhalb der main()-Methode. Ich mache das, um Ihnen zu zeigen, wie Sie die Schrift für alle Textfelder ersetzen können. Wenn Sie lieber die Finger von Manipulationen am UIManager lassen möchten, können Sie den geladenen Font einfach mit ta.setFont() setzen (dann aber wieder im Konstruktor).
         String filename = "/Users/thomas/Downloads/C64_TrueType_v1.0-STYLE/fonts/C64_User_Mono_v1.0-STYLE.ttf";  
         File file = new File(filename);  
         try {  
           Font f = Font.createFont(Font.TRUETYPE_FONT, file);  
           f = f.deriveFont(36f);  
           UIManager.put("TextArea.font", f);  
         } catch (FontFormatException ex) {  
           Logger.getLogger(C64FontDemo.class.getName()).log(Level.SEVERE, null, ex);  
         } catch (IOException ex) {  
           Logger.getLogger(C64FontDemo.class.getName()).log(Level.SEVERE, null, ex);  
         }  
Hier das Ergebnis:
Screenshot des Java-Programms nach allen Anpassungen
Screenshot des Java-Programms nach allen Anpassungen
Sieht cool aus, oder?
Lassen Sie mich zum Schluss noch kurz zusammenfassen, was wir hier gesehen haben. Swing kann nämlich auch Zeichensätze laden, die nicht im Wirtssystem installiert sind. Hierfür müssen Sie nur Font.createFont() aufrufen. Im Anschluss an das Erzeugen leiten Sie die gewünschte Größe ab. Achten Sie darauf, das die Größe als float gesetzt wird. Ein vergessenes f hat schon viel Kopfzerbrechen verursacht. Wenn Ihnen nicht klar ist, was ich meine, werfen Sie doch einmal einen Blick auf die verschiedenen Parameter, die möglich sind.

2 comments:

  1. Der verwendete Emulator heißt übrigens VirtualC64 und läuft unter Mac OS X.

    ReplyDelete
  2. Noch ein Tipp: Mit dem Programm DiskImagery64 kann man C64-Disketten-Images erstellen und bearbeiten.

    ReplyDelete