Системный внешний вид в JFileChooser, но с нимбовой темой внешнего вида

Внешний вид и расположение окон в JFileChooser намного лучше, чем в других видах и ощущениях, похожих на нимб.

Поэтому я ищу способ, чтобы внешний вид системы выглядел и чувствовался, но сверху была нимб или другая тема.

Это возможно? Если да, то как это можно сделать?


person Daniel Ryan    schedule 19.08.2011    source источник
comment
Вы спрашиваете, возможно ли изменить внешний вид только одного компонента?   -  person mre    schedule 19.08.2011
comment
Нет, я уже знаю, как это сделать. Я хочу получить макет одного внешнего вида и использовать тему другого.   -  person Daniel Ryan    schedule 19.08.2011
comment
Обратите внимание, что Windows PLAF (макет и т. д.) недоступен на *nix и Mac. (к счастью).   -  person Andrew Thompson    schedule 19.08.2011
comment
Да я знаю, хе-хе. Хотя внешний вид системы JFileChooser на Mac хуже, чем на Windows. Хотя для решения этой проблемы можно использовать библиотеку Quaqua.   -  person Daniel Ryan    schedule 19.08.2011


Ответы (2)


Это возможно, хотя я не знаю, рекомендуется ли это. Мне удалось заставить его работать, попросив представление обновить себя для всех компонентов JFileChooser, кроме самого верхнего (поскольку это заменит все компоненты выбора компонентами Nimbus, которые вам не нужны).

Я бы расценил это как хак, который может работать или не работать в зависимости от внутреннего внешнего вида Windows. Он основан на том, что весь JFileChooser создается компонентами Swing. Если он когда-либо был изменен для использования более прямого собственного рендеринга (например, Java просит Windows отрисовать значительную часть средства выбора), это не сработает. Не знаю, насколько хорошо этот трюк будет работать с другими компонентами.

Во всяком случае, этот код работал с JDK 7:

package test;

import java.awt.Component;

import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel; //Or use com.sun.... if you are using JDK < 7

public class LAFTester
{
    public static void main(String... args)
    throws Exception
    {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        JFileChooser chooser = new JFileChooser();
        chooser.updateUI(); //Create UI objects
        UIManager.setLookAndFeel(NimbusLookAndFeel.class.getName()); //Now set look and feel
        //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); //works with metal as well
        refreshUI(chooser, false);

        chooser.showOpenDialog(null);
    }

    private static void refreshUI(JComponent c, boolean includeParent)
    {
        if (includeParent)
            c.updateUI();

        for (int i = 0; i < c.getComponentCount(); i++)
        {
            Component child = c.getComponent(i);
            if (child instanceof JComponent)
            {
                refreshUI((JComponent)child, true);
            }
        }
    }
}
person prunge    schedule 19.08.2011
comment
+1, интересный хак. Это также работает на JDK6 Metal LAF. Определенно покупатель остерегается решения. - person camickr; 19.08.2011
comment
Классная вещь, которая работает. Однако окраска не идеальна. Так что, возможно, я пока просто нацелюсь на строку заголовка. Знаете ли вы, как я могу просто настроить таргетинг на строку заголовка? - person Daniel Ryan; 19.08.2011
comment
@Zammbi вы потенциально можете настроить таргетинг на отдельные компоненты, не обновляя пользовательский интерфейс для каждого компонента, а только для определенных компонентов, возможно, выполняя проверки instanceof в refreshUI () - некоторые компоненты, составляющие пользовательский интерфейс Windows JFileChooser, находятся в специализированных классах. - person prunge; 19.08.2011
comment
@Спасибо еще раз. Я поиграю с этим позже и посмотрю, что я могу сделать :) - person Daniel Ryan; 19.08.2011

Я предполагаю, что вы говорите о панели в левой части диалогового окна выбора файлов Windows, на которой есть значки Desktop, My Computer My Documents?

Ну, я сомневаюсь, что это можно сделать, потому что это специфично для LAF. Это было добавлено в Windows LAF, потому что именно так выглядит выбор файла платформы Windows. Он не поддерживается в других LAF.

person camickr    schedule 19.08.2011