2011-07-23 30 views
6

我試圖用Java中的本地Windows文件對話框,使用JNA調用COMDLG32功能GetOpenFileName。我做了一個靜態方法,OpenFileDialog.display看起來像這樣:調用GetOpenFileName失敗的Swing應用程序

public static List<File> display(Window parent, boolean allowMultiSelect) 

它應該返回選定的文件,或NULL,如果用戶取消了對話框。

我有兩個簡單的測試程序。這一個按預期方式工作:

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,其according to MSDN是:

CDERR_INITIALIZATION 0×0002

初始化過程中常見的對話框功能失敗。當有足夠的內存不可用時,通常會發生此錯誤。

...這並不能真正幫助我的所有的東西。我在這裏做錯了什麼?


我穿上引擎收錄的其他來源,所以我不會弄亂的問題太多:

OpenFileDialoghttp://pastebin.com/HDmu0TjX

ComDlg32JNAhttp://pastebin.com/X5F5LLip

+0

這可能是贓物,但如果你清楚你的ByteBuffer使用它通過調用'緩衝區之前。明確();?' –

+0

這並沒有什麼差別,遺憾的是 – perp

回答

1

所以最好不要做來自Swing EDT的任何JNA代碼。嘗試使用SwingWorker在後臺線程中運行對話框。

我會盡力幫助更多的,但沒有COMDLG32我的Win 7的64位:(

+0

感謝您的建議,但在後臺線程做沒有幫助:-(搞笑的是你沒有的DLL「。因爲我也運行Win 7 64並且擁有它 – perp

+1

@perp:你使用的是什麼版本的jna?當我用3.3.0運行你的代碼時,它會拋出一個UnsatisfiedLinkException異常,但它在3.2.7中正常工作,事件Swing test。 –

+0

我似乎無法使它適用於任一版本,我也試過了32位和64位的JVM,接下來我會嘗試直接映射,並且ma ybe甚至跳過JNA,並直接與JNI進行溝通,以查看問題出在哪裏。 – perp

相關問題