Сбой вызова GetOpenFileName через JNA для приложения Swing - PullRequest
6 голосов
/ 23 июля 2011

Я пытаюсь использовать собственный диалог файлов 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

1 Ответ

1 голос
/ 24 июля 2011

Лучше не делать код JNA из Swing EDT.Попробуйте использовать SwingWorker для запуска диалога в фоновом потоке.

Я бы попробовал помочь, но на моем 64-битном Win 7 нет comdlg32: (

...