NullPointerException при использовании WindowsFileChooserUI - PullRequest
1 голос
/ 07 марта 2012

Я получаю эту ошибку во время выполнения, я пытаюсь сделать средство выбора java-файла похожим на Windows.

код ошибки:

Exception in thread "main" java.lang.NullPointerException
at com.sun.java.swing.plaf.windows.WindowsFileChooserUI.installComponents(WindowsFileChooserUI.java:306)
at javax.swing.plaf.basic.BasicFileChooserUI.installUI(BasicFileChooserUI.java:173)
at com.sun.java.swing.plaf.windows.WindowsFileChooserUI.installUI(WindowsFileChooserUI.java:150)
at Main.getImg(Main.java:49)
at Main.main(Main.java:19)

Код:

JFileChooser fico = new JFileChooser();
WindowsFileChooserUI wui = new WindowsFileChooserUI(fico);
wui.installUI(fico);
int returnVal = fico.showOpenDialog(null);

1 Ответ

4 голосов
/ 07 марта 2012

Когда объект пользовательского интерфейса инициализируется, он пытается прочитать некоторые значения по умолчанию пользовательского интерфейса из диспетчера пользовательского интерфейса, который он ожидает (свойство FileChooser.viewMenuIcon), которое всегда существует в Windows L & F, но не в Metal L & F.

Во-первых, предупреждение. Смешивание нескольких L & F одновременно в Swing опасно. Swing действительно предназначен для запуска только с одним L & F одновременно.

Лучший способ настроить «специальный» переключатель файлов - инициализировать все через UI Manager при запуске приложения.

//Do this first thing in your application before any other UI code

//Switch to Windows L&F
LookAndFeel originalLaf = UIManager.getLookAndFeel();
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

//Create the special file chooser
JFileChooser windowsChooser = new JFileChooser();

//Flick the L&F back to the default
UIManager.setLookAndFeel(originalLaf);

//And continue on initializing the rest of your application, e.g.
JFileChooser anotherChooserWithOriginalLaf = new JFileChooser();

Теперь у вас есть два компонента с двумя разными L & F, которые вы можете использовать.

//First chooser opens with windows L&F
windowsChooser.showOpenDialog(null);

//Second chooser uses default L&F
anotherChooserWithOriginalLaf.showOpenDialog(null);
...