我创建了一个JFile Chooser,并使用.setCurrentDirectory();通过传递newFile(“。”)将目录设置为我的java项目文件夹的根目录;这似乎有时很好,但有时它会抛出错误。这一切都发生在程序加载之前,在任何用户输入之前,因此我可以告诉它是否发生完全随机。这是我的代码的文件选择器相关位:
public class PnlHighScores extends JPanel {
JFileChooser fcScores = new JFileChooser();
PnlHighScores() {
fcScores.addChoosableFileFilter(new TxtFilter());
//***********This seems to cause a strange error only somethimes, Right as the program is run!***********
fcScores.setCurrentDirectory(new File("."));//http://www.rgagnon.com/javadetails/java-0370.html
}
class ActFileChooser implements ActionListener {
public void actionPerformed(ActionEvent e) {//http://download.oracle.com/javase/tutorial/uiswing/examples/components/FileChooserDemoProject/src/components/FileChooserDemo.java
int returnVal = fcScores.showOpenDialog(PnlHighScores.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
filScores = fcScores.getSelectedFile();
sFileLocation = filScores.getAbsolutePath();//.getParent();//http://www.java-forums.org/awt-swing/29485-how-retrieve-path-filechooser.html
//System.out.println(filScores);
pnlScoreText.updateScoreFile(sFileLocation);
}
}
}
class TxtFilter extends javax.swing.filechooser.FileFilter {//http://www.exampledepot.com/egs/javax.swing.filechooser/Filter.html
public boolean accept(File file) {
String filename = file.getName();
if (file.isDirectory()) {
return true;
} else {
return filename.endsWith(".txt");
}
}
public String getDescription() {
return "*.txt";
}
}
}
确切的错误是:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Invalid index
at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:497)
at sun.swing.FilePane$SortableListModel.getElementAt(FilePane.java:528)
at javax.swing.plaf.basic.BasicListUI.updateLayoutState(BasicListUI.java:1343)
at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1294)
at javax.swing.plaf.basic.BasicListUI.getCellBounds(BasicListUI.java:935)
at javax.swing.JList.getCellBounds(JList.java:1600)
at javax.swing.JList.ensureIndexIsVisible(JList.java:1116)
at sun.swing.FilePane.ensureIndexIsVisible(FilePane.java:1540)
at sun.swing.FilePane.doDirectoryChanged(FilePane.java:1466)
at sun.swing.FilePane.propertyChange(FilePane.java:1513)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
at java.awt.Component.firePropertyChange(Component.java:8128)
at javax.swing.JFileChooser.setCurrentDirectory(JFileChooser.java:568)
at Cannon.PnlSettings.<init>(PnlSettings.java:45)
at Cannon.FraWindow.<init>(FraWindow.java:19)
at Cannon.Main.main(Main.java:7)
Java Result: 1
Main类只是创建FraWindow,而FraWindow通过其构造方法创建PnlSetting。它们应该是无关紧要的,但这是主要的,以防万一:
package Cannon;
//Creates the frame
public class Main {
public static void main(String[] args) {
FraWindow fraMain = new FraWindow();
}
}
答案 0 :(得分:2)
这一切都在程序加载时发生,
影响GUI的所有代码都应在Event Dispatch Thread上执行。 GUI的创建应该包含在SwingUtilities.invokeLater()中。
阅读Concurrency上Swing教程中的部分以获取更多信息。并查看演示创建GUI的正确方法的任何示例。