Как настроить внешний вид jframe

Я немного запутался, куда поместить это:

try {
    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch(Exception e){

}

Я не расширял класс JFrame, а использовал JFrame f = new JFrame(); Спасибо :D


person Yayatcm    schedule 02.03.2012    source источник
comment
Программная настройка внешнего вида   -  person chicout    schedule 03.03.2012
comment
Убедитесь, что Look'n'Feel настроен перед инициализацией рамы.   -  person Martijn Courteaux    schedule 03.03.2012


Ответы (4)


Наиболее распространенное место для этого — прямо внутри метода static void main(String[] args). Вот так:

public static void main(String[] args) {
    try { 
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
    } catch(Exception ignored){}

    new YourClass(); //start your application
}  

для получения дополнительной информации посетите этот сайт: http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

person Byron Voorbach    schedule 13.03.2012
comment
в основном правильно, но не рекомендуется для Nimbus :) он начал свою жизнь в com.sun.* в jdk6 с уверенностью, что будет перемещен в javax.swing в jdk7. Поэтому вместо того, чтобы жестко кодировать имя класса, запросите у UIManager установленный lookAndFeels и прокручивайте их, пока не будет найден класс, содержащий Nimbus. - person kleopatra; 13.03.2012
comment
Честно говоря, я никогда не использую Look and Feel для своих Java-программ. Но если я когда-нибудь буду, я буду использовать ваш фрагмент!! огромное спасибо - person Byron Voorbach; 13.03.2012

Примечание: это не ответ на вопрос (который заключался в том, где установить LAF). Вместо этого он отвечает на вопрос как настроить LAF таким образом, который не зависит от имени его пакета. Упрощает жизнь в случае перемещения класса, т.к. f.i. Nimbus из com.sun* в javax.swing.

Основной подход заключается в том, чтобы запросить у UIManager установленные LAF, перебрать их, пока не будет найдено совпадение, и установить его. Вот такие методы, реализованные в SwingX:

/**
 * Returns the class name of the installed LookAndFeel with a name
 * containing the name snippet or null if none found.
 * 
 * @param nameSnippet a snippet contained in the Laf's name
 * @return the class name if installed, or null
 */
public static String getLookAndFeelClassName(String nameSnippet) {
    LookAndFeelInfo[] plafs = UIManager.getInstalledLookAndFeels();
    for (LookAndFeelInfo info : plafs) {
        if (info.getName().contains(nameSnippet)) {
            return info.getClassName();
        }
    }
    return null;
}

Использование (здесь без обработки исключений)

String className = getLookAndFeelClassName("Nimbus");
UIManager.setLookAndFeel(className); 
person kleopatra    schedule 13.03.2012

UIManager.setLookAndFeel() не будет работать с уже созданными компонентами. Вот хороший способ настроить Look And Feel для каждого окна в вашем приложении. Это установит его на все открытые Windows в вашей программе. Любые новые созданные окна будут использовать то, что было установлено UIManager.

    UIManager.setLookAndFeel(lookModel.getLookAndFeels().get(getLookAndFeel()));
    for(Window window : JFrame.getWindows()) {
        SwingUtilities.updateComponentTreeUI(window);
    }
person John Mercier    schedule 26.02.2013
comment
Спасибо, работает нормально. SonarLint упоминает, что вместо этого можно использовать Window.getWindows(). - person Eric Duminil; 13.07.2021

Вы можете поместить этот блок в свой основной метод после создания JFrame или в конструктор класса, расширяющего JFrame.


    try
    {
        //Set the required look and feel
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        //Update the component tree - associate the look and feel with the given frame.
        SwingUtilities.updateComponentTreeUI(frame);
    }//end try
    catch(Exception ex)
    {
        ex.printStackTrace();
    }//end catch

person ITE    schedule 08.07.2013