2013-09-05 54 views
0

我使用Eclipse開發SWT應用程序。下面的代碼在Windows上運行,但不能在Macintosh上:爲什麼JfileChooser.showOpenDialog在Mac OSX上掛起?

import javax.swing.JFileChooser; 

public class Test { 
    public static void main(String[] args) { 
     final JFileChooser fc = new JFileChooser(); 
     int ret = fc.showOpenDialog(null); 
     System.out.println("ret = " + ret); 
    } 
} 

在進入showOpenDialog,在Mac光標不斷旋轉,我也得到了Java控制檯執行以下操作:

2013-09-05 08:20:40.568 java[1271:707] [Java CocoaComponent compatibility mode]: Enabled 
2013-09-05 08:20:40.569 java[1271:707] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000 
2013-09-05 08:20:41.227 java[1271:dd03] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x7fa211e82600> '(null)') unlocked when not locked 
2013-09-05 08:20:41.227 java[1271:dd03] *** Break on _NSLockError() to debug. 

我試過的Java 1.6,Java 1.7。我試過設置 -Dcom.apple.awt.CocoaComponent.CompatibilityMode=false -XstartOnFirstThread 但這沒有效果。

這必須是一些非常基本的東西。我錯過了什麼?

+0

什麼版本的SWT? –

回答

0

這個程序運行在我的Mac罰款,並返回在不到一秒鐘:

import java.io.*; 
import javax.swing.*; 
import javax.swing.filechooser.*; 

/** to isolate and understand why JFileChooser is blocking. */ 
public class DebugJFC { 

    public static void main(String[] args) { 
     System.err.println("JFileChooser "); 
     JFileChooser listFC= new JFileChooser("."); 
     System.err.println("done"); 
     } 

    } 

當我在Linux上運行它,它打印「JFileChooser的」後打印「完成」前掛起。更糟糕的是,「新的JFileChooser」聲明在Linux上已經工作了多年,並且今天才開始失敗。那是怎麼回事!??

的Linux:> Java的版本 Java版本 「1.7.0_45」 的Java(TM)SE運行時環境(建立1.7.0_45-B18) 的HotSpot的Java(TM)64位服務器VM(建24.45-B08 ,混合模式)

的Mac:> Java的版本 Java版本 「1.6.0_65」 的Java(TM)SE運行時環境(建立1.6.0_65-b14-462-11M4609) 爪哇的HotSpot(TM)64 Bit Server VM(內置20.65-b04-462,混合模式)

+0

問題已解決。 GADS。它完全離開了牆壁...... 我的Mac上的X11服務器被掛起,雖然我不知道它。看起來是問題的程序是我在另一臺機器上遠程運行的Java程序。什麼是連接? 看起來,當JFileChooser的一個實例由Java創建時,它想要查詢X以便稍後保留一些空間來顯示選擇器菜單。當然,X不會提供錯誤消息,說明它已掛起。 Java也從未發現這個問題。 只是殺死我的X服務器,並重新啓動它清除了整個問題。 –

2

給大家帶來同樣問題的好日子!

也許我爲時已晚回答這個問題,但它可能有助於解決此問題的人。

經過一番研究,我試圖與LookAndFeel玩耍。然後我試着改變外觀和感覺打開「showSaveDialog()」,它似乎工作。我不能保證它可以100%的工作,但直到現在它已經對我工作了(「沒有成功掛:)」)。如果再次失敗:)這裏生病報告是我的代碼:

//更新:它更好的用戶FileDialogg用於Mac OS X

private File saveFile() { 
    String osName = System.getProperty("os.name"); 
    String homeDir = System.getProperty("user.home"); 
    File selectedPath = null; 
    if (osName.equals("Mac OS X")) { 
     System.setProperty("apple.awt.fileDialogForDirectories", "true"); 
     FileDialog fd = new FileDialog(f, "Choose a file", FileDialog.LOAD); 
     fd.setDirectory(homeDir); 
     fd.setVisible(true); 
     String filename = fd.getDirectory(); 
     selectedPath = new File(filename); 
     if (filename == null) { 
      System.out.println("You cancelled the choice"); 
     } else { 
      System.out.println("You chose " + filename); 
     } 
     System.setProperty("apple.awt.fileDialogForDirectories", "true"); 
    } else { 
     fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
     fc.setCurrentDirectory(new File(homeDir)); 
     fc.setAcceptAllFileFilterUsed(false); 
     fc.showOpenDialog(null); 
     selectedPath = fc.getSelectedFile(); 
    } 
    return selectedPath; 
} 

代碼是不完美的,但u得到點:)