2011-05-07 91 views
4

我在使用'JFileChooser'Swing对象的开发计算机上启动任何应用程序时遇到问题。当我最初开发应用程序并进行测试时,File Chooser窗口打开并且一切都很好,但是像一个星期后,我尝试再次运行该应用程序,根本没有任何显示。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企业版,SP1

的Java版本:1.5.0_12(JDK和JRE两者)

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

+0

如果你怀疑你的系统是罪魁祸首,关于你的电脑的信息可能是有用的。 (OS?JRE版本?等) – coobird 2011-05-07 11:15:06

+0

可能不是造成直接问题的原因,但应该在EDT上构建Swing GUI。 – 2011-05-07 11:37:38

+0

@Andrew:你的意思是'应该在EDT上构建Swing GUI。 “?一个URL会有帮助..请注意,上面的代码片段仅用于测试问题是来自我的原始应用程序还是与机器相关的原因。谢谢。 – 2011-05-07 11:42:34

回答

3

@安德鲁汤普森是对的:从event dispatch thread开始可能不是问题,但相关的错误是众所周知的protean和难以重现。作为参考,我已经在下面显示了一个共同的重新分解。它成功地测试了在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

注意涉及'sb.append()'和'frame.pack()'的变化,这应该是不相关的。 – trashgod 2011-05-07 17:06:38