2009-07-18 5 views
5

Tengo una aplicación Java Swing ya escrita (por lo que no hay marcos de interfaz de usuario de conmutación) que me gustaría ver al menos decente usando GTKLookAndFeel. Ya he explicado las diferencias de tamaño de fuente y componente en LookAndFeels, pero una cosa que no puedo entender es por qué mis menús emergentes no tienen fronteras. Parece que están usando bordes de Synth que no se ven como GTK nativos. Me gustaría poder admitir Metal, Windows y GTK, pero estas ventanas emergentes se ven terribles. ¿Es esto un error? ¿Cuál es una buena manera (no hacky) de arreglar esto sin afectar los bordes de otros LookAndFeels que se ven bien?¿Por qué las ventanas emergentes GtkLookAndFeel de Java no tienen borde?

Respuesta

2

En mi opinión, GTK LaF está roto por diseño. Sí no respetan la configuración de la IU de los programadores (color de la fuente, bordes de fondo, etc.) para JCOmponents aparentemente aleatorios. Esto se debe a que obtiene su configuración de un archivo .gtkrc, no de llamadas a setXXX (...). Me quedaría con Metal para Linux y 'nativo' para Windows.

Respuesta:

El GTK + aspecto y la sensación puede ser personalizado a través de archivos de recursos. GTK + mirada de oscilación y la sensación utiliza el siguiente algoritmo para localizar los archivos de recursos :

  1. Si existe el swing.gtkthemefile propiedad del sistema, analizarlo y detener, por ejemplo: java -Dswing.gtkthemefile =/tmp/customTheme -jar SwingSet2.jar.
  2. Si existe el archivo user.home/.gtkrc-2.0, analízalo y continúa.
  3. Determine el nombre del tema seleccionado por el usuario (THEMENAME) a ​​través de la propiedad de escritorio gnome.net/ThemeName que se determina mediante XSETTINGS. Si esta propiedad es nula, use el valor predeterminado como THEMENAME. 1. Si el archivo user.home/.themes/THEMENAME/gtk-2.0/gtkrc existe, lo analizan y lo detienen. 2. Si existe la propiedad del sistema swing.gtkthemedir y existe el archivo swing.gtkthemedir/THEMENAME/gtk-2.0/gtkrc , analízalo y finalízate. 3. Si la propiedad del sistema swing.gtkthemedir no existe y existe el archivo /usr/share/themes/THEMENAME/gtk-2.0/gtkrc , analízalo y finalízalo. 4. Por último, si swing.gtkthemedir se define parse swing.gtkthemedir/THEMENAME/gtk/gtkrc, de lo contrario, analice /usr/share/themes/THEMENAME/gtk/gtkrc.

Una forma de GTK + se puede personalizar es por manera de un motor de temas. Un puñado de motores existen. En 1.4.2, Swing admite archivos de tema para Default, pixmap y bluecurve engines. Estamos investigando formas de abrir la API para permitir la creación de motores GTK adicionales. Visite http://www.themes.org para ver ejemplos.
- http://java.sun.com/j2se/1.4.2/docs/guide/swing/1.4/Post1.4.html

Mi conjetura es que Java está tomando el tema desde otro archivo rc o no se soportan las opciones de borde actuales.

+0

Pero si está siguiendo un .gtkrc, las ventanas emergentes deberían tener un borde y una sombra, ya que todas las demás aplicaciones nativas lo hacen. –

2

sé la respuesta es tardía, pero si alguien ve a esta pregunta en Google (como yo), entonces me parece que esta solución es mejor que nada:

if (UIManager.getLookAndFeel().getClass().getName().equals("com.sun.java.swing.plaf.gtk.GTKLookAndFeel")) 
     aPopupMenu.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.gray)); 

No parece trabajar para menús agregados a los menús emergentes (incluso si llama a la función sobre ellos), pero muestra el borde en el menú principal.

2

Aquí hay un artículo en el blog que describe dos enfoques diferentes para solucionar el problema:

http://www.ailis.de/~k/archives/67-Workaround-for-borderless-Java-Swing-menus-on-Linux.html

El primer enfoque se describe cómo solucionar el tema GTK utilizado. Esto corrige todos los problemas de separador de menú y borde de menú de todas las aplicaciones de Swing.

El segundo enfoque es la aplicación de una solución en el código Java de una aplicación Swing. Puede usar esto en sus propias aplicaciones para que sus usuarios no tengan que corregir el tema GTK manualmente.

1

Hay archivos rc incompatibles.

Desafortunadamente, el blog http://www.ailis.de/~k/ está cerrado.

Ubuntu/Gnome Shell: p. Ej. /usr/share/themes/Adwaita/gtk-2.0/gtkrc

style "menu" { 
xthickness = 1 
ythickness = 1 ... 
} 
... style "separator_menu_item" { 
xthickness = 1 
ythickness = 1 
... } 

Actualización 11/30/2015: Para Ubuntu/Unidad refieren http://blog.hani-ibrahim.de/en/ubuntus-swing-gtk-laf.html => menú global, las fuentes nativas.

En Linux Mint están los menus.rc archivos en la casa de moneda-temas en /usr/share/themes/[mint-theme]/gtk-2.0/style

En la sección “Menú” estilo cambio:

xthickness = 0 
ythickness = 0 
text[ACTIVE] = @base_color 

a:

xthickness = 1 
ythickness = 1 
text[ACTIVE] = @fg_color 

En la sección style "men u-elemento separador” cambiar la entrada:

ythickness = 0 

a:

ythickness = 1 

me escribió una bash-script de menta, que hace el trabajo de forma automática. Soluciona los 3 problemas:

  • Falta el borde del menú.
  • Color de fuente incorrecto de casilla de verificación activada y elementos de menú de botón de opción (la fuente tiene el mismo color que el fondo y parece invisible).
  • Sin separadores de menú.
Cuestiones relacionadas