1

我正在使用 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.

我试过 Java 1.6、Java 1.7。我试过设置 -Dcom.apple.awt.CocoaComponent.CompatibilityMode=false -XstartOnFirstThread ,但没有效果。

这一定是非常基本的东西。我错过了什么?

4

2 回答 2

4

祝大家有同样问题的美好一天!

也许我回答这个问题为时已晚,但它可能会帮助遇到这个问题的人。

经过一些研究,我尝试使用 LookAndFeel。然后我尝试在打开“showSaveDialog()”时改变外观和感觉,它似乎有效。我不能保证它在 100% 的时间内都能正常工作,但到目前为止,它对我来说效果很好(“没有成功挂起 :)”)。如果失败,我会再次报告:) 这是我的代码:

//更新:最好使用 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;
}

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

于 2016-01-22T08:28:16.200 回答
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”之后和打印“done”之前挂起。更糟糕的是,“new JFileChooser”声明已经在 Linux 上运行了多年,直到今天才开始失败。那是怎么回事!??

Linux: > java -version java version "1.7.0_45" Java(TM) SE Runtime Environment (build 1.7.0_45-b18) Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08,混合模式)

Mac: > java -version java version "1.6.0_65" Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609) Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462,混合模式)

于 2013-11-02T04:21:44.070 回答