JNAを使用してcomdlg32関数を呼び出し、JavaでネイティブのWindowsファイルダイアログを使用しようとしていますGetOpenFileName
。OpenFileDialog.display
次のような静的メソッドを作成しました。
public static List<File> display(Window parent, boolean allowMultiSelect)
選択したファイルを返すか、ユーザーがダイアログをキャンセルした場合は null を返す必要があります。
2 つの簡単なテスト プログラムがあります。これは期待どおりに機能します:
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);
}
});
}
}
後者の例では、 MSDN によるとCommDlgExtendedError
2 が返されます。
CDERR_INITIALIZATION 0x0002
初期化中にコモン ダイアログ ボックス関数が失敗しました。このエラーは、十分なメモリが利用できない場合によく発生します。
...これはあまり役に立ちません。ここで何が間違っていますか?
他のソースを PasteBin に置いたので、質問が雑然としすぎないようにしました。
OpenFileDialog
: http://pastebin.com/HDmu0TjX
ComDlg32JNA
: http://pastebin.com/X5F5LLip