Frage

Gibt es eine Möglichkeit in SWT einfach eine proportionale Schrift zu erhalten, die über verschiedene Betriebssysteme funktioniert?

Zum Beispiel. Dies funktioniert unter Linux, aber nicht unter Windows:


Font mono = new Font(parent.getDisplay(), "Mono", 10, SWT.NONE);

oder muss ich eine Methode haben, das Laden versucht unterschiedlichen Schriftarten (Consolas, Terminal, Monaco, Mono), bis man nicht null ist? Alternativ könnte ich es in einer Eigenschaftendatei beim Start angeben.

Ich habe versucht, immer die Systemschriftart aus Anzeige, aber das war nicht Monospace.

War es hilfreich?

Lösung

Nach dem Abschnitt Font-Konfigurationsdateien in der JDK-Dokumentation von Unterstützung von -related APIs das Konzept der Logical Font s verwendet wird, um bestimmte plattformunabhängige Fonts zu definieren, die auf physische Schriftarten in den Standardschriftart Konfigurationsdateien zugeordnet werden:

  

Die Java-Plattform definiert fünf logische Font-Namen, die jeder Implementierung unterstützen muss: Serif, SansSerif, Monospace, Dialog und DialogInput. Diese logischen Font-Namen abgebildet werden, um physikalische Schriften in der Implementierung abhängig Möglichkeiten.

Also in Ihrem Fall, ich würde versuchen,

Font mono = new Font(parent.getDisplay(), "Monospaced", 10, SWT.NONE);

einen Griff auf die physische proportionale Schrift der aktuellen Plattform, um Ihren Code ausgeführt wird.

Bearbeiten : Es scheint, dass SWT weiß nichts über logische Schriftarten ( Bug 48055 auf eclipse.org beschreibt dies im Detail). In diesem Fehlerbericht eine hackish Abhilfe vorgeschlagen wurde, wo der Name des physischen Schriftart aus einer AWT Schriftart abgerufen werden kann ...

Andere Tipps

verbrachte ich während meines Kopfes gegen diesen bashing, bis ich, dass offensichtlich realisierte den Zugang zu einer nichtproportionalen Schriftart für den Einsatz in seinen Textfeldern haben verdunkeln müssen, Konsole etc. Ein wenig zu graben aufgedreht:

Font terminalFont = JFaceResources.getFont(JFaceResources.TEXT_FONT);

Welche funktioniert, wenn alles, was Sie interessiert sind, ist halten einige Monospace-Schrift zu bekommen.

Edit: oder auf Basis von @ cTRON Kommentar:

Font font = JFaceResources.getTextFont();

Edit: Caveat (basierend auf @ Lü Kommentar): Das wird Ihr den konfigurierte Text Schriftart erhalten, die vom Benutzer außer Kraft gesetzt werden kann, und nicht eine Monospace-Schrift sein. Allerdings wird es im Einklang mit, zum Beispiel der Schriftart im Editor und Konsole verwendet, das ist wahrscheinlich , was Sie wollen.

Nach bestem Wissen und Gewissen, wird die AWT API nicht zugrunde liegende Font Informationen preisgeben. Wenn Sie es bekommen können, würde ich erwarten, dass es die Umsetzung abhängig sein. Sicherlich Vergleich der Schrift Mapping-Dateien in ein paar JRE lib Verzeichnissen, kann ich sehen, dass sie nicht in einer konsistenten Art und Weise definiert sind.

Sie können Ihre eigene Schriftarten laden, aber das scheint ein wenig verschwenderisch gegeben Sie wissen, dass die Plattform mit kommt, was Sie brauchen.

Dies ist ein Hack, der eine JRE Schrift lädt:

private static Font loadMonospacedFont(Display display) {
    String jreHome = System.getProperty("java.home");
    File file = new File(jreHome, "/lib/fonts/LucidaTypewriterRegular.ttf");
    if (!file.exists()) {
        throw new IllegalStateException(file.toString());
    }
    if (!display.loadFont(file.toString())) {
        throw new IllegalStateException(file.toString());
    }
    final Font font = new Font(display, "Lucida Sans Typewriter", 10,
            SWT.NORMAL);
    display.addListener(SWT.Dispose, new Listener() {
        public void handleEvent(Event event) {
            font.dispose();
        }
    });
    return font;
}

Es funktioniert auf IBM / Win32 / JRE1.4, Sun / Win32 / jre1.6, Sun / Linux / jre1.6, ist aber ein ziemlich zerbrechlich Ansatz. Je nach Bedarf für L18N, könnte es auch dort sein Problem (ich habe nicht geprüft).

Ein weiterer Hack wäre die Schriftarten auf der Plattform zur Verfügung zu testen:

public class Monotest {

    private static boolean isMonospace(GC gc) {
        final String wide = "wgh8";
        final String narrow = "1l;.";
        assert wide.length() == narrow.length();
        return gc.textExtent(wide).x == gc.textExtent(narrow).x;
    }

    private static void testFont(Display display, Font font) {
        Image image = new Image(display, 100, 100);
        try {
            GC gc = new GC(image);
            try {
                gc.setFont(font);
                System.out.println(isMonospace(gc) + "\t"
                        + font.getFontData()[0].getName());
            } finally {
                gc.dispose();
            }
        } finally {
            image.dispose();
        }
    }

    private static void walkFonts(Display display) {
        final boolean scalable = true;
        for (FontData fontData : display.getFontList(null, scalable)) {
            Font font = new Font(display, fontData);
            try {
                testFont(display, font);
            } finally {
                font.dispose();
            }
        }
    }

    public static void main(String[] args) {
        Display display = new Display();
        try {
            walkFonts(display);
        } finally {
            display.dispose();
        }
    }

}

Dies ist wahrscheinlich kein guter Ansatz, da es möglicherweise verlassen Sie Fragen locale ausgesetzt. Außerdem Sie wissen nicht, ob der erste nichtproportionalen Schrift Sie stoßen nicht einige Windungen Symbol gesetzt.

Der beste Ansatz kann nur sein, Ihre beste Vermutung auf einer Schriftart / locale-Mapping Weißen Liste basierend zu nehmen und stellen Sie sicher, dass die Benutzer auf einfache Weise die Benutzeroberfläche neu konfigurieren können sich anpassen über Fontdialog .

Für Menschen, die das gleiche Problem haben, können Sie jede Schriftart TTF-Datei herunterladen, steckte es in den Ressourcenordner (in meinem Fall /font/**.ttf) und fügen Sie diese Methode, um Ihre Anwendung. Es ist 100% arbeiten.

public Font loadDigitalFont(int policeSize) {
    URL fontFile = YouClassName.class
            .getResource("/fonts/DS-DIGI.TTF");
    boolean isLoaded = Display.getCurrent().loadFont(fontFile.getPath());
    if (isLoaded) {
        FontData[] fd = Display.getCurrent().getFontList(null, true);
        FontData fontdata = null;
        for (int i = 0; i < fd.length; i++) {
            if (fd[i].getName().equals("DS-Digital")) {
                fontdata = fd[i];
                break;
            }}
        if (fontdata != null) {
            fontdata.setHeight(policeSize);
            fontdata.setStyle(SWT.BOLD);return new Font(getDisplay(), fontdata));}
    }return null;   }

Wenn Sie nur ein Monospace Schriftart verwenden "Courier" => new Font(display, "Courier", 10, SWT.NORMAL)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top