Внешний вид системы на JFileChooser, но с темой Nimbus - PullRequest
8 голосов
/ 19 августа 2011

Внешний вид окон на JFileChooser намного лучше, чем у других интерфейсов.

Так что я ищу способ, чтобы макет системы выглядел и чувствовался, но имел нибит илидругие темы сверху.

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

Ответы [ 2 ]

6 голосов
/ 19 августа 2011

Это возможно, хотя я не знаю, рекомендуется ли это. Мне удалось заставить его работать, попросив представление обновить все, кроме самого верхнего компонента 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);
            }
        }
    }
}
2 голосов
/ 19 августа 2011

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

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

...