Я пытаюсь использовать собственный диалог файлов Windows на Java, используя JNA для вызова функции comdlg32 GetOpenFileName
. Я сделал статический метод, OpenFileDialog.display
, который выглядит так:
public static List<File> display(Window parent, boolean allowMultiSelect)
Возвращает выбранные файлы или ноль, если пользователь отменил диалог.
У меня есть две простые тестовые программы. Этот работает, как и ожидалось:
package nativedialogs;
import java.io.File;
import java.util.List;
public class SimpleTest {
public static void main(String[] args) {
List<File> files = OpenFileDialog.display(null, true);
System.out.println(files);
}
}
Этот, однако, не:
package nativedialogs;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class SwingTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("Open file dialog");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
List<File> files = OpenFileDialog.display(f, true);
// These also fail:
// List<File> files = OpenFileDialog.display(f, false);
// List<File> files = OpenFileDialog.display(null, true);
// List<File> files = OpenFileDialog.display(null, false);
System.out.println(files);
}
});
f.add(button);
f.pack();
f.setVisible(true);
}
});
}
}
Для последнего примера CommDlgExtendedError
возвращает 2, что в соответствии с MSDN равно:
CDERR_INITIALIZATION 0x0002
Не удалось выполнить функцию общего диалогового окна во время инициализации. Эта ошибка часто возникает, когда недостаточно памяти.
... что на самом деле не очень мне помогает. Что я тут не так делаю?
Я поместил другие источники в PasteBin, чтобы не слишком загромождать вопрос:
OpenFileDialog
: http://pastebin.com/HDmu0TjX
ComDlg32JNA
: http://pastebin.com/X5F5LLip