JavaVM Windows 7 64bit - JFileChooser () не показывает диалоговое окно - PullRequest
1 голос
/ 12 ноября 2010

Я пытаюсь создать простое консольное Java-приложение, которое требует, чтобы пользователи выбирали файлы из своей локальной файловой системы.

Консоль предлагает пользователю выбрать один из доступных параметров, а затем включает входучитывая.

public Client() throws UnknownHostException, IOException {
    printuseroptions();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    char userdecision = br.readLine().charAt(0);

    System.out.println(userdecision);

    switch(userdecision){
        case '1':
            System.out.println("Which file would you like to open?");
            openfile(br.readLine());
            break;
        case '2':
            System.out.println("Which file would you like to close?");
            closefile(br.readLine());
            break;
        }

private boolean openfile(String path){
    System.out.println("openfile("+path+")");
    return false;
}

private boolean closefile(String path){
    System.out.println("closefile("+path+")");
    new JFileChooser().showOpenDialog(null);
    return false;
}

Независимо от того, что я делаю, всплывающее окно JFileChooser не открывается.На консоли не отображается никаких ошибок, но в пошаговом отладочном сообщении указывается следующая ошибка:

Поток цитаты [main] (Suspended)
ClassNotFoundException (Throwable). (String, Throwable) строка: 217
ClassNotFoundException (Exception). (String, Throwable) строка: недоступно ClassNotFoundException. (String) строка: недоступно
URLClassLoader $ 1.run () строка: недоступно
AccessController.doPrivileged (PrivilegedExceptionAction,AccessControlContext) строка: недоступно [собственный метод]
Launcher $ ExtClassLoader (URLClassLoader) .findClass (String) строка: недоступно
Launcher $ ExtClassLoader.findClass (String) строка: недоступно
Launcher $ ExtClassLoader (ClassLoader) .loadClass (String, логическое) строка: недоступно Launcher $ AppClassLoader (ClassLoader) .loadClass (String, логическое) строка: недоступно Launcher $ AppClassLoader.loadClass (String, логическое) строка: недоступно
Launcher $ AppClassLoader(ClassLoader) .loadClass (String) строка: недоступно
ResourceBundle $ RBClassLoader.loadClass (String) строка: недоступно
CoreResourceBundleControl (ResourceBundle $ Control) .newBundle (String, Locale, String, ClassLoader, boolean) строка: недоступно
ResourceBundle.loadBundle (CacheKey, список, логическое значение) строка: недоступно ResourceBundle.findBundle (CacheKey, List, List, int, Control, ResourceBundle) строка: недоступно
ResourceBundle.getBundleImpl (String, Locale, ClassLoader, ResourceBundle $ Control) строка: недоступно
Строка ResourceBundle.getBundle (String, ResourceBundle $ Control): недоступно
Строка инструментария $ 3.run (): недоступна Строка AccessController.doPrivileged (PrivilegedAction): недоступно [собственный метод]
Строка инструментария. (): недоступно
Строка компонента (): недоступно
Строка Client.closefile (): 90 Строка клиента. (): 60
Строка Client.main (String []): 36

Этот же код отлично работает на 32-битной машине с Linux, поэтому я подозреваю, что проблема связана с Windows.

приведенный ниже код работает, как и ожидалось, как в Windows, так и в Linux, поэтому я подозреваю, что это может быть связано с различными путями обработки ввода с консоли в Windows по сравнению с Linux (CR LF).

import javax.swing.JFileChooser;

public class Example {
    public static void main(String[] args) {
        new JFileChooser().showOpenDialog(null);
    }
}

Спасибо

1 Ответ

1 голос
/ 08 декабря 2010

Похоже, вы здесь так же новы, как и я.;) Давайте посмотрим, смогу ли я помочь.

Я внес изменения в ваш код, чтобы он компилировался, и запустил его на компьютере под управлением Windows Server 2003 x64, и не увидел никаких проблем - диалог выбора файловоткрывается.

Я предлагаю две вещи, которые вы можете сделать, чтобы исключить другие возможности:

1) Убедитесь, что внешний вид и внешний вид системы установлены.Установите свой внешний вид и настройки системы по умолчанию, используя это при запуске вашей программы: UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

2) Убедитесь, что вы только создаете и открываете JFileChooserDialog и все другие компоненты Swing в потоке диспетчеризации событий.(ЛЕТНЕЕ СЕВЕРОАМЕРИКАНСКОЕ ВОСТОЧНОЕ ВРЕМЯ).Если вы знаете, что текущий поток является основным или каким-либо другим рабочим потоком (и я предполагаю, что это происходит из-за того, что вы принимаете консольный ввод), вам нужно вызвать SwingUtilities.invokeLater(Runnable) для правильного выполнения.

Удачи счто.

...