Java 为什么JfileChooser.showOpenDialog挂在Mac OSX上?

Java 为什么JfileChooser.showOpenDialog挂在Mac OSX上?,java,eclipse,macos,swt,Java,Eclipse,Macos,Swt,我正在使用Eclipse开发一个SWT应用程序。以下代码适用于Windows,但不适用于Macintosh: import javax.swing.JFileChooser; public class Test { public static void main(String[] args) { final JFileChooser fc = new JFileChooser(); int ret = fc.showOpenDialog(null);

我正在使用Eclipse开发一个SWT应用程序。以下代码适用于Windows,但不适用于Macintosh:

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.
2013-09-05 08:20:40.568 java[1271:707][java CocoaComponent兼容模式]:已启用
2013-09-05 08:20:40.569 java[1271:707][java CocoaComponent兼容模式]:将SWT超时设置为0.100000
2013-09-05 08:20:41.227 java[1271:dd03]***-[NSConditionLock unlock]:未锁定时锁定('(null)')未锁定
2013-09-05 08:20:41.227 java[1271:dd03]***打开_NSLockError()进行调试。
我试过Java1.6和Java1.7。我试过了
-Dcom.apple.awt.CocoaComponent.CompatibilityMode=false-XstartOnFirstThread
但这没有效果


这一定是很基本的东西。我遗漏了什么?

此程序在我的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”和打印“done”之前挂起。 更糟糕的是,“newjfilechooser”语句在Linux上已经运行了多年,直到今天才开始失败。怎么回事

Linux:>java版本 java版本“1.7.0_45” Java(TM)SE运行时环境(build 1.7.0_45-b18) Java HotSpot(TM)64位服务器虚拟机(构建24.45-b08,混合模式)

Mac:>java版本 java版本“1.6.0_65” Java(TM)SE运行时环境(build 1.6.0_65-b14-462-11M4609)
Java HotSpot(TM)64位服务器虚拟机(构建20.65-b04-462,混合模式)

此程序在我的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”和打印“done”之前挂起。 更糟糕的是,“newjfilechooser”语句在Linux上已经运行了多年,直到今天才开始失败。怎么回事

Linux:>java版本 java版本“1.7.0_45” Java(TM)SE运行时环境(build 1.7.0_45-b18) Java HotSpot(TM)64位服务器虚拟机(构建24.45-b08,混合模式)

Mac:>java版本 java版本“1.6.0_65” Java(TM)SE运行时环境(build 1.6.0_65-b14-462-11M4609)
Java HotSpot(TM)64位服务器虚拟机(构建20.65-b04-462,混合模式)

祝所有有相同问题的人早安

也许我来不及回答这个问题,但它可能会帮助有这个问题的人

经过一些研究后,我试着去玩弄LookAndFeel。然后,我尝试在打开“showSaveDialog()”时更改外观,似乎效果不错。我不能保证它在所有情况下都能正常工作,但到目前为止,它对我来说都很好(“没有成功挂起:)”。如果失败,我会再次报告:)这是我的代码:

//更新:最好使用适用于mac os x的FileDialogg

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;
}

代码并不完美,但你明白了这一点:)

祝所有有同样问题的人早安

也许我来不及回答这个问题,但它可能会帮助有这个问题的人

经过一些研究后,我试着去玩弄LookAndFeel。然后,我尝试在打开“showSaveDialog()”时更改外观,似乎效果不错。我不能保证它在所有情况下都能正常工作,但到目前为止,它对我来说都很好(“没有成功挂起:)”。如果失败,我会再次报告:)这是我的代码:

//更新:最好使用适用于mac os x的FileDialogg

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;
}

代码并不完美,但你得到了要点:)

问题已经解决。盖兹。这是完全离谱的…我的Mac上的X11服务器挂起了,尽管我不知道。似乎是问题所在的程序是我在另一台机器上远程运行的Java程序。什么是联系??当Java创建JFileChooser实例时,它似乎希望查询X,以便为以后显示选择器菜单保留一些空间。当然,X并没有提供一条错误消息说它已挂起。Java也从来没有解决过这个问题。仅仅杀死我的X服务器并重新启动它就解决了整个问题。问题解决了。盖兹。这是完全离谱的…我的Mac上的X11服务器挂起了,尽管我不知道。似乎是问题所在的程序是我在另一台机器上远程运行的Java程序。什么是联系??当Java创建JFileChooser实例时,它似乎希望查询X,以便为以后显示选择器菜单保留一些空间。当然,X并没有提供一条错误消息说它已挂起。Java也从来没有解决过这个问题。仅仅杀死我的X服务器并重新启动它就解决了整个问题。