Проблемы с запуском JFileChooser

У меня возникают проблемы с запуском любого приложения на моем компьютере для разработки, которое использует объект 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);
}
}

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

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

EDIT 1 Версия ОС: Windows Server 2003 Enterprise Version, SP1.

Версия Java: 1.5.0_12 (как JDK, так и JRE)

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


person Kris Ogirri    schedule 07.05.2011    source источник
comment
Если вы подозреваете, что виновата ваша система, может оказаться полезной информация о вашем ПК. (ОС? Версия JRE? и т. д.)   -  person coobird    schedule 07.05.2011
comment
Вероятно, это не является причиной непосредственной проблемы, но графические интерфейсы Swing должны быть созданы на основе EDT.   -  person Andrew Thompson    schedule 07.05.2011
comment
@Andrew: Что вы подразумеваете под «Графические интерфейсы Swing должны быть созданы на основе EDT». '? URL-адрес был бы полезен. Также обратите внимание, что приведенный выше фрагмент кода просто использовался для проверки того, была ли проблема связана с моим исходным приложением или причиной, связанной с машиной. Спасибо.   -  person Kris Ogirri    schedule 07.05.2011
comment
Дополнительные сведения см. в уроке Параллелизм в Swing в Учебном руководстве по Java. . Цитата с этой страницы поток отправки событий, в котором выполняется весь код обработки событий. Большая часть кода, взаимодействующего с инфраструктурой Swing, также должна выполняться в этом потоке.   -  person Andrew Thompson    schedule 07.05.2011
comment
+1 за sscce.   -  person trashgod    schedule 07.05.2011


Ответы (2)


@Эндрю Томпсон прав: запуск в потоке диспетчеризации событий может это не проблема, но связанные с этим ошибки, как известно, многообразны и их трудно воспроизвести. Для справки, я показал общий рефакторинг ниже. Он успешно протестирован на 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);
    }
}
person trashgod    schedule 07.05.2011
comment
Обратите внимание на изменения, связанные с sb.append() и frame.pack(), которые не должны иметь значения. - person trashgod; 07.05.2011

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

person Handsken    schedule 03.11.2011