1

我正在尝试创建一个简单的基于控制台的 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 弹出框都不会打开。控制台上未显示任何错误,但调试步骤显示以下错误:

Blockquote Thread [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, boolean) 行:不可用 Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean) 行:不可用 Launcher$AppClassLoader.loadClass(String, boolean) 行:不可用
Launcher$ AppClassLoader(ClassLoader).loadClass(String) 行:不可用
ResourceBundle$RBClassLoader.loadClass(String) 行:不可用
CoreResourceBundleControl(ResourceBundle$Control).newBundle(String, Locale, String, ClassLoader, boolean) 行:不可用
ResourceBundle。 loadBundle(CacheKey, List, Control, boolean) 行:不可用 ResourceBundle.findBundle(CacheKey, List, List, int, Control, ResourceBundle) 行:不可用
ResourceBundle.getBundleImpl(String, Locale, ClassLoader, ResourceBundle$Control) 行:不可用
ResourceBundle.getBundle(String, ResourceBundle$Control) 行:不可用
Toolkit$3.run() 行:不可用 AccessController.doPrivileged(PrivilegedAction) 行:不可用 [本机方法]
Toolkit.() 行:不可用
Component.() 行:不可用
Client.closefile() 行:90 Client.() 行:60
Client.main(String[]) 行:36

相同的代码在 Linux 32 位机器上完美运行,所以我怀疑问题与 Windows 有关。

下面的代码在 Windows 和 Linux 上都按预期运行,所以我怀疑可能是由于在 Windows 与 Linux (CR LF) 中处理控制台输入的方式不同。

import javax.swing.JFileChooser;

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

谢谢

4

1 回答 1

1

看起来你和我一样新来的。;) 让我们看看我能不能帮忙。

我对您的代码进行了更改以使其能够编译,并在 Windows Server 2003 x64 机器上运行它,但没有发现任何问题 - 文件选择器对话框打开。

我建议您可以做两件事来消除其他可能性:

1) 确保设置了系统的原生外观。在程序启动时使用此选项将您的外观设置为系统默认值:UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

2) 确保您只JFileChooserDialog在事件调度线程 (EDT) 内构建和打开您的 和所有其他 Swing 组件。如果您知道当前线程是主线程或其他一些工作线程(我认为这是因为您正在接受控制台输入),您需要调用SwingUtilities.invokeLater(Runnable)正确执行。

祝你好运。

于 2010-12-08T13:05:44.780 回答