2013-09-05 3 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, Мак курсор закручивает навсегда, и я получаю следующее в консоли 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 Runtime Environment (сборка 1.7.0_45-b18) Java HotSpot (TM) 64-разрядного сервера VM (сборка 24.45-B08 , смешанный режим)

Mac:> Java -версия Java версия "1.6.0_65" Java (TM) SE Runtime Environment (сборка 1.6.0_65-b14-462-11M4609) Java HotSpot (TM) 64- Bit Server VM (сборка 20.65-b04-462, смешанный режим)

+0

Проблема решена. Gads. Это было полностью у стены ... Сервер X11 на моем Mac был повешен, хотя я этого не знал. Программа, которая, казалось, была проблемой, была программа Java, на которой я работал удаленно на другой машине. Какая связь? Похоже, что когда экземпляр JFileChooser создается Java, он хочет запросить X, возможно, зарезервировать некоторое пространство для отображения меню выбора позже. Конечно, X не дает сообщение об ошибке, в котором говорится, что он висел. И Java никогда не выясняет проблему. Простое убийство моего X-сервера и его перезапуск очистили всю проблему. –

2

Добрый день всем, у кого такая же проблема!

Возможно, я опоздал, чтобы ответить на это, но это может помочь кому-то, у кого эта проблема.

После некоторого исследования я пытаюсь поиграть с LookAndFeel. Затем я попытался изменить внешний вид при открытии «showSaveDialog()», и, похоже, он работает. Я не могу гарантировать, что он работает в 100% случаев, но до сих пор он работал со мной просто отлично («не удалось повесить :)»). Ill отчет еще раз, если он не :) Вот мой код:

// Обновление: Что лучше пользователя 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; 
} 

кодекс не идеален, но у получить точку :)

Смежные вопросы