Задать вопрос
webhamster
@webhamster

Как поменять тему оформления в произвольном Java-приложении?

Здравствуйте!



Я в Java полный профан, просто пользователь. Но хочу раз и навсегда разобраться: как менять и настраивать темы оформления в Java-приложениях? И возможно ли это сделать, если в самом Java-приложении работа с темами оформления не предусмотрена?



Например, я пользуюсь IDE NetBeans. В нем можно настраивать только внешний вид области редактирования кода. А настроить тему оформления всего NetBeans — цвет рамочек, линий в деревьях, шрифтов — нельзя. А мне, к примеру, нужно поменять цвет всех Java-рамок. Как это сделать?



Единственное что я накопал — это использование Java-опции --laf. Например, можно запустить NetBeans такой командой:



./netbeans --laf com.sun.java.swing.plaf.gtk.GTKLookAndFeel




Опция --laf будет передана java-среде, и NetBeans запустится с GTK-интерфейсом. Но тут возникает несколько вопросов:



1. Как узнать названия доступных тем оформления интерфейсов? Я нарыл только вышеприведенное название.



2. Как настроить цветовую схему для выбранной темы? Возможно ли это впринципе?



И еще вопрос. Я нашел программу TinyLaf: www.muntjak.de/hans/java/tinylaf/index.html. Она генерирует *.theme файлы. Можно ли эти темы использоват в произвольной Java-программе, например в NetBeans? Как их подключить?
  • Вопрос задан
  • 9607 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
mardy_bum
@mardy_bum
1. Вот этот простенький код выведет установленные в системе laf'ы
import javax.swing.UIManager;

public class Plaf {
    public static void main(String[] args) {
    UIManager.LookAndFeelInfo plaf[] = UIManager.getInstalledLookAndFeels();
       for (int i = 0; i < plaf.length; i++)
          System.out.println(plaf[i].getName() + "\n" + plaf[i].getClassName());
    }
}

Правда выбор не велик. У меня на маке доступно всего 4 темы:

Metal
javax.swing.plaf.metal.MetalLookAndFeel
Nimbus
com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
CDE/Motif
com.sun.java.swing.plaf.motif.MotifLookAndFeel
Mac OS X
com.apple.laf.AquaLookAndFeel


2. Это возможно, но, насколько я знаю, простого пути нет. Придется вручную копаться в коде и править каждый элемент темы. Хотя я слышал, что тема Nimbus позволяет менять цветовую схему, но сам не пробовал.

Насчет TinyLaf. Вам повезло, софтина хорошо отдокументирована, читайте доки. В файле readme был описан процесс подключения тем.
Ответ написан
Комментировать
webhamster
@webhamster Автор вопроса
> 1. Вот этот простенький код выведет установленные в системе laf'ы

Не понял, что с этим кодом делать обычному пользователю? Компилировать что ли надо? А готовой команды или опции у программы «java» нет что ли?

.
> Хотя я слышал, что тема Nimbus позволяет менять цветовую схему, но сам не пробовал.

Хм, так позволяет или нет? Как? Гугл молчит. Такое впечатление, что точная наука информатика превратилась в магию: может быть можно, но никто не знает.

.
> Насчет TinyLaf. Вам повезло, софтина хорошо отдокументирована, читайте доки. В файле readme был описан процесс подключения тем.

Я не нашел там описания процесса подключения тем к стороннему Java-приложению. Там описывается только как подключать к коду/сборке.
Ответ написан
Комментировать
@bald2b
Человек же просто спрашивает как менять темы в любом приложении :)

Надо передать java программе параметр swing.defaultlaf
например
java -jar -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel myApp.jar

Если тема идет из стороннего jar, то jar должен быть в classpath
Ответ написан
KhanTengri
@KhanTengri
Вообще, я не вижу серьезной проблемы в этом…

Сперва скажу, что получать список существующих тем смысла нет.
Для каждой конкретной версии jdk они всегда и везде одинаковы.
Например, для jdk6, как выше и написали уже, они будут такими:

Metal
javax.swing.plaf.metal.MetalLookAndFeel
Nimbus
com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
CDE/Motif
com.sun.java.swing.plaf.motif.MotifLookAndFeel

Исключением является только Mac, где добавляется тема:

Mac OS X
com.apple.laf.AquaLookAndFeel

Все остальные темы, вроде Alloy, Stubstance, Synthetica etc. вы добавляете сами, руками.

Конкретно по вашему вопросу…
Я не думаю, что вот эти вот цветовые изменения, которые вы хотие делать, можно делать параметрами при запуске.
Все изменения цветов рамочек, фонов и проч. — это все кастомизация интерфейса.
Для примера, вы можете глянуть приложение Metalworks, которое поставляется со всеми jdk от компании Oracle.
Вы можете найти его здесь: <JAVA_HOME>/demo/jfc/Metalworks/Metalworks.jar
Загляните в код(в папке рядом) и увидете, что все цветовые схемы там прописаны мануально (вызовами методов или чтением собственных конфигов)

Самый лучший вариант для вас, как я считаю — это написать собственный класс, который расширяет одну из тем, например, javax.swing.plaf.metal.MetalLookAndFeel и прописать там какого цвета рамочка вам нужна. Как вариант, вы можете этот класс написать таким образом, чтобы он просто считывал рядом лежащий properties файл. Это даст вам возможность легко менять цвета, без перекомпиляции класса. Затем, скомпилировав этот класс, просто положите его туда, где jdk сможет его найти (что бы не править постоянно CLASSPATH) и запускайте ваш NetBeans с названием этого вашего класса LaF…
Это даже проще, потому что вам не придется постоянно помнить названия sun'овских пакетов…
Ваши com.example.laf.CustomTheme
против sun'овских com.sun.java.swing.plaf.motif.MotifLookAndFeel, например…
Ответ написан
Комментировать
@lubchak
А можно начинать пользовать JavaFX и править все css.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы