JFileChooser发布问题

时间:2011-05-07 11:01:11

标签: java swing jfilechooser

我在使用'JFileChooser'Swing对象的开发机器上启动任何应用程序时遇到问题。当我最初开发应用程序并对其进行测试时,“文件选择器”窗口打开,一切都很好,但就像一周后,我再次尝试运行应用程序,根本没有显示任何内容。

起初我认为这是一个线程问题(我原来的应用程序使用了一点多线程),所以我应对并粘贴了以下代码(我从互联网上获取代码)来测试它:

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企业版SP1

Java版本是:1.5.0_12(JDK和JRE)

我也担心这可能与网络问题有关... JFileChooser正在寻找网络目录,而DNS可能存在冲突。有没有办法检查这个?也许检查JVM正在记录什么?

2 个答案:

答案 0 :(得分:3)

@Andrew Thompson是对的:从event dispatch thread开始可能不是问题,但相关的错误是众所周知的变形,难以重现。作为参考,我在下面展示了一个常见的重新分解。它使用

在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);
    }
}

答案 1 :(得分:0)

使用线程时,JFileChooser遇到类似问题,上传了帖子here。我通过阅读这个维基http://en.wikipedia.org/wiki/Event_dispatching_thread得到了很多帮助(虽然它已被提及)。 我的问题是我有一个在线程中运行的扫描程序,在显示GUI之前总是等待输入。