1

ユーザーがローカルファイルシステムからファイルを選択する必要がある単純なコンソールベースの Java アプリケーションを作成しようとしています。

コンソールは、利用可能なオプションの 1 つを選択するようにユーザーに促し、指定された入力をオンにします。

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 マシンで実行しましたが、問題は見られませんでした。ファイル選択ダイアログが開きます。

他の可能性を排除するためにできることを 2 つ提案します。

1) システムのネイティブなルック アンド フィールが設定されていることを確認します。プログラムの起動時にこれを使用して、ルック アンド フィールをシステムのデフォルトに設定します。UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

JFileChooserDialog2) Event Dispatch Thread (EDT) 内で、および他のすべての Swing コンポーネントのみを構築して開いていることを確認します。現在のスレッドがメイン スレッドまたはその他のワーカー スレッドであることがわかっている場合 (コンソール入力を取得しているためだと思います)、SwingUtilities.invokeLater(Runnable)正しい実行を呼び出す必要があります。

頑張ってください。

于 2010-12-08T13:05:44.780 に答える