Проблемы с запуском JFileChooser - PullRequest
4 голосов
/ 07 мая 2011

У меня проблемы с запуском любого приложения на моей машине разработки, использующего объект Swing «JFileChooser».Когда я первоначально разработал приложение и протестировал его, открылось окно «Выбор файла», и все было в порядке, но, как и через неделю, я попытался запустить приложение еще раз, и ничего не показывалось вообще.

Сначала я подумал, что это былопроблема с многопоточностью (мое оригинальное приложение использовало небольшую многопоточность), поэтому я скопировал и вставил следующий код (я получил код из Интернета), чтобы проверить его:

package com.kwm.util.test;


import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

public class Main {

public static void main(String[] args) {
    final JFrame frame = new JFrame("JFileChooser Demo");


    final JFileChooser fc = new JFileChooser();
    fc.setMultiSelectionEnabled(true);
    fc.setCurrentDirectory(new File("C:\\tmp"));

    JButton btn1 = new JButton("Show Dialog");
    btn1.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            fc.showDialog(frame, "Choose");
        }
    });
    JButton btn2 = new JButton("Show Open Dialog");
    btn2.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            int retVal = fc.showOpenDialog(frame);
            if (retVal == JFileChooser.APPROVE_OPTION) {
                File[] selectedfiles = fc.getSelectedFiles();
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < selectedfiles.length; i++) {
                    sb.append(selectedfiles[i].getName() + "\n");
                }
                JOptionPane.showMessageDialog(frame, sb.toString());
            }

        }
    });
    JButton btn3 = new JButton("Show Save Dialog");
    btn3.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            fc.showSaveDialog(frame);

        }
    });

    Container pane = frame.getContentPane();
    pane.setLayout(new GridLayout(3, 1, 10, 10));
    pane.add(btn1);
    pane.add(btn2);
    pane.add(btn3);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 200);
    frame.setVisible(true);
}
}

И все же я вижуничего такого.Я предполагаю, что машина имеет проблему, но не может определить, в чем проблема.

Любая помощь с этим будет принята с благодарностью.

РЕДАКТИРОВАТЬ 1 Версия ОСверсия Windows Server 2003 Enterprise, SP1

Версия Java: 1.5.0_12 (JDK и JRE)

Я также боюсь, что это может быть связано с проблемой сети ...JFileChooser ищет сетевой каталог, и DNS может конфликтовать.Есть ли способ проверить это?Может быть, проверить, что JVM регистрирует?

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

@ Эндрю Томпсон прав: начиная с потока рассылки событий может и не быть проблемой, но связанные с ним ошибки общеизвестно белоснежны и их трудно воспроизвести.Для справки, я показал общий ре-факторинг ниже.Он успешно протестирован на Mac OS X 10.5, используя

$ java -version
java version "1.5.0_28"
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

public class Main {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                createGUI();
            }
        });
    }

    private static void createGUI() throws HeadlessException {
        final JFrame frame = new JFrame("JFileChooser Demo");
        final JFileChooser fc = new JFileChooser();
        fc.setMultiSelectionEnabled(true);
        fc.setCurrentDirectory(new File("C:\\tmp"));
        JButton btn1 = new JButton("Show Dialog");
        btn1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                fc.showDialog(frame, "Choose");
            }
        });
        JButton btn2 = new JButton("Show Open Dialog");
        btn2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int retVal = fc.showOpenDialog(frame);
                if (retVal == JFileChooser.APPROVE_OPTION) {
                    File[] selectedfiles = fc.getSelectedFiles();
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < selectedfiles.length; i++) {
                        sb.append(selectedfiles[i].getName());
                        sb.append("\n");
                    }
                    JOptionPane.showMessageDialog(frame, sb.toString());
                }
            }
        });
        JButton btn3 = new JButton("Show Save Dialog");
        btn3.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                fc.showSaveDialog(frame);
            }
        });
        Container pane = frame.getContentPane();
        pane.setLayout(new GridLayout(3, 1, 10, 10));
        pane.add(btn1);
        pane.add(btn2);
        pane.add(btn3);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}
0 голосов
/ 03 ноября 2011

Похожая проблема с JFileChooser при использовании тем, загрузил сообщение здесь . Я получил большую помощь, прочитав эту вики http://en.wikipedia.org/wiki/Event_dispatching_thread (хотя об этом уже упоминалось). Моя проблема заключалась в том, что у меня был сканер, который работал в потоке, всегда ожидая ввода, прежде чем показывать графический интерфейс.

...