Почему у всплывающих окон GtkLookAndFeel в Java нет границ? - PullRequest
6 голосов
/ 19 июля 2009

У меня есть уже написанное приложение Java Swing (так что не нужно переключать фреймворки пользовательского интерфейса), которое я хотел бы выглядело как минимум достойно, используя GTKLookAndFeel. Я уже учел различия между размерами шрифтов и компонентов в LookAndFeels, но я не могу понять, почему мои всплывающие меню вообще не имеют границ. Похоже, они используют границы Synth, которые не выглядят как GTK. Я хотел бы иметь возможность поддерживать Metal, Windows и GTK, но эти всплывающие окна выглядят ужасно. Это ошибка? Какой хороший (не хакерский) способ исправить это, не затрагивая границы других LookAndFeels, которые выглядят хорошо?

Ответы [ 3 ]

2 голосов
/ 29 августа 2011

Я знаю, что ответ запоздал, но если кто-нибудь увидит этот вопрос в Google (как я), то я обнаружу, что это решение лучше, чем ничего:

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

Похоже, это не работает для меню, добавленного во всплывающие меню (даже если вы вызываете функцию для них), но оно показывает границу в главном меню.

2 голосов
/ 19 июля 2009

На мой взгляд GTK LaF сломан по дизайну. Он не учитывает настройки пользовательского интерфейса программистов (фон цвета границ шрифта и т. Д.) Для кажущихся случайными JCOmponents. Это потому, что он получает свои настройки из файла .gtkrc, а не из вызовов setXXX (...). Я бы выбрал Metal для Linux и «native» для Windows.

Ответ:

GTK + может выглядеть и чувствовать настраивается с помощью файлов ресурсов. GTK + Swing выглядит и чувствует себя использует следующий алгоритм, чтобы найти файлы ресурсов:

  1. Если системное свойство swing.gtkthemefile существует, проанализируйте его и остановиться, например: Java -Dswing.gtkthemefile = / tmp / customTheme -jar SwingSet2.jar.
  2. Если файл user.home / .gtkrc-2.0 существует, проанализируйте его и продолжите.
  3. Определите имя выбранной пользователем темы (THEMENAME) с помощью свойство рабочего стола gnome.net/ThemeName который определяется с помощью XSETTINGS. Если это свойство имеет значение null, используйте Default как ТЕМА ИМ. 1. Если файл user.home / .themes / THEMENAME / gtk-2.0 / gtkrc существует разбор и остановка. 2. Если системное свойство swing.gtkthemedir существует и файл swing.gtkthemedir / THEMENAME / GTK-2.0 / gtkrc существует, разбери его и остановись. 3. Если системного свойства swing.gtkthemedir не существует и файл /usr/share/themes/THEMENAME/gtk-2.0/gtkrc существует, разбери его и остановись. 4. И наконец, если определено значение swing.gtkthemedir swing.gtkthemedir / THEMENAME / GTK / gtkrc, иначе разбирать /usr/share/themes/THEMENAME/gtk/gtkrc.

Один из способов настройки GTK + - способ тематического движка. Горсть двигатели существуют. В 1.4.2 Swing поддерживает файлы тем для Default, растровое изображение и движки bluecurve. Мы исследовать способы открыть API разрешить создание дополнительные двигатели GTK. Визит http://www.themes.org для примеров.
- http://java.sun.com/j2se/1.4.2/docs/guide/swing/1.4/Post1.4.html

Я предполагаю, что java берет свою тему из другого rc-файла ИЛИ текущие параметры границ не поддерживаются.

1 голос
/ 04 ноября 2015

Существуют несовместимые rc-файлы.

К сожалению, блог http://www.ailis.de/~k/ закрыт.

Ubuntu / Gnome Shell: Например. /usr/share/themes/Adwaita/gtk-2.0/gtkrc

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

Обновление от 30.11.2015: Для Ubuntu / Unity см. http://blog.hani -ibrahim.de / en / ubuntus-swing-gtk-laf.html => Глобальное меню , родные шрифты.

В Linux Mint в Mint-темах /usr/share/themes/[mint-theme]/gtk-2.0/style

есть файлы menus.rc.

В разделе стиль «меню» изменить:

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

до:

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

В разделе стиль «menu-item-separator» изменить запись:

ythickness = 0

до:

ythickness = 1

Я написал bash-скрипт для Mint, который выполняет эту работу автоматически. Это исправляет все 3 проблемы:

  • Отсутствует граница меню.
  • Неправильный цвет шрифта для активированных флажков и пунктов меню радио-кнопки (шрифт имеет тот же цвет, что и фон, и выглядит невидимым).
  • Нет разделителей меню.
...