2011-05-07 101 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