23 votos

SWT - OS agnóstico manera fuente de espacio sencillo

¿Hay una manera de SWT para obtener una fuente de espacio sencillo simplemente, que funciona en varios sistemas operativos?

Por ejemplo. Esto funciona en Linux, pero no Windows:


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

o ¿es necesario tener un método que intenta cargar diferentes fuentes (Consolas, Terminal, Mónaco, Mono), hasta que uno no es null? Alternativamente podría especificarlo en un archivo de propiedades en el inicio.

He intentado conseguir la fuente del sistema de exhibición, pero era monospaced.

29voto

Bartleby Puntos211

Pasé un rato golpear mi cabeza contra éste hasta que me di cuenta que obviamente eclipse debe tener acceso a una fuente monoespacio para su uso en el texto de los campos, consola etc.. Cava un poco subido:

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

Que trabaja si todo lo que te interesados es conseguir de cierta fuente monoespacio.

14voto

fhe Puntos3969

De acuerdo a la sección de la Fuente de los Archivos de Configuración en el JDK documentación de Apoyo a la InternacionalizaciónApi relacionadas con el concepto de la Lógica de la Fuentes es usado para definir ciertos independiente de la plataforma fuentes que se asignan a las fuentes físicas en la fuente por defecto de los archivos de configuración:

La Plataforma Java define cinco lógica de los nombres de las fuentes que cada aplicación debe soportar: Serif, SansSerif, Monoespaciada, de Diálogo, y DialogInput. Estas fuente lógica de los nombres se asignan a fuentes físicas en dependientes de la implementación de las maneras.

Así que, en su caso, que me gustaría probar

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

para obtener un identificador de la fuente solo espacio físico de la plataforma actual se ejecuta el código.

Edit: parece que la SWT no sabe nada acerca de la lógica fuentes (Error 48055 en eclipse.org se describe en detalle). En este informe de error de una solución fue sugerido, donde el nombre de la fuente física puede ser recuperada a partir de un AWT fuente...

4voto

McDowell Puntos62645

Al mejor de mi conocimiento, el AWT de la API de no exponer subyacente Fuente de información. Si usted puede llegar a ella, yo esperaría a ser dependientes de la implementación. Ciertamente, la comparación de la fuente de asignación de archivos en un par de JRE lib directorios, puedo ver que no están definidos de una manera coherente.

Usted puede cargar sus propias fuentes, pero que parece un poco derrochador dado a conocer la plataforma viene con lo que usted necesita.

Este es un hack que carga un JRE fuente:

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

Se trabaja en IBM/Win32/JRE1.4, Sol/Win32/JRE1.6, Sol/Linux/JRE1.6, pero es bastante frágil enfoque. Dependiendo de sus necesidades de internacionalización (I18N), que podría ser un problema allí también (no he comprobado).

Otro hack iba a ser la prueba de que las fuentes disponibles en la plataforma:

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

}

Esto probablemente no es un buen enfoque, ya que puede dejar expuesto a problemas de configuración regional. Además, no sé si la primera fuente monoespaciada te encuentras no es de los devanados de conjunto de iconos.

El mejor enfoque puede ser sólo para tomar su mejor conjetura basada en una fuente/configuración regional de asignación de la lista blanca y asegúrese de que los usuarios pueden fácilmente volver a configurar la interfaz de usuario para adaptarse a sí mismos a través de FontDialog.

2voto

freesniper Puntos34

Para personas que tienen el mismo problema, puede descargar cualquier archivo de fuente ttf, ponerlo en la carpeta de recursos (en mi caso /font/**.ttf) y añadir este método a su aplicación. trabajo 100%.

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: