簡體   English   中英

為什么JfileChooser.showOpenDialog在Mac OSX上掛起?

[英]Why does JfileChooser.showOpenDialog hang on Mac OSX?

我正在使用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但這沒有任何效果。

這一定是非常基本的東西。 我想念什么?

祝大家有同樣的問題!

也許我來不及回答這個問題,但它可能會幫助遇到此問題的人。

經過研究后,我嘗試使用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;
}

代碼不是完美的,但你明白了:)

該程序可以在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版本“ 1.7.0_45” Java(TM)SE運行時環境(內部版本1.7.0_45-b18)Java HotSpot(TM)64位服務器VM(內部版本24.45-b08,混合模式)

Mac:> java -version Java版本“ 1.6.0_65” Java SE運行時環境(內部版本1.6.0_65-b14-462-11M4609)Java HotSpot(TM)64位服務器VM(內部版本20.65-b04-462,混合模式)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM