为什么这个简单的循环在netbeans、java (JFRAME)中失败?



我没有在java中编程,但决定通过在netbeans中创建jframe来尝试它。在自动生成的initComponent()方法中,这个for循环运行失败,告诉我以下事情:

  • 类型
  • 的非法启动
  • 找不到符号:class i

    friendList.setModel(new javax.swing.AbstractListModel() {
        URL url = getClass().getResource("friends");
        File folder = new File(url.getPath());
        File[] listOfFiles = folder.listFiles();
        String[] elements = new String[listOfFiles.length];
        for(int i=0; i<listOfFiles.length;i++) {
            elements[i] = (listOfFiles[i].getName());
    }
    

    谁能解释一下?

让我们看看能不能解开这个…

你的基本问题似乎是你试图在可执行上下文(方法或构造函数)之外定义可执行代码。

URL url = getClass().getResource("friends");后面跟着File folder = new File(url.getPath());是没有意义的,因为使用getResource的目的是查找磁盘上可能存在也可能不存在的资源。在大多数情况下,它被嵌入到应用程序的jar上下文中。

我"认为"你要做的是找到一个目录,这可以用更像…的东西来完成。

File folder = new File("friends");

这假定目录friends与您的程序处于相同的执行上下文中。

接下来,不要创建AbstractListModel并尝试在可执行上下文之外运行代码,您可以简单地创建DefaultListModel并像这样填充它:

DefaultListModel model = new DefaultListModel();
File[] listOfFiles = folder.listFiles();
for(int i=0; i<listOfFiles.length;i++) {
    model.addElement(listOfFiles[i].getName());
}
friendList.setModel(model);

举个例子

也许你应该花更多的时间来学习语言的基础知识,然后再深入到GUI的复杂性中,它将极大地帮助你解决这类问题…作为一个友好的建议。

问题是因为您正在尝试在函数外部调用for循环。什么代码

new javax.swing.AbstractListModel() {}

的作用是创建一个匿名子类。这样想:

class (anonymous) extends javax.swing.AbstractListModel{
    URL url = getClass().getResource("friends");
    File folder = new File(url.getPath());
    File[] listOfFiles = folder.listFiles();
    String[] elements = new String[listOfFiles.length];
    for(int i=0; i<listOfFiles.length;i++) {
        elements[i] = (listOfFiles[i].getName());
}

你可以看到这会在哪里引起问题修复它的最简单方法是添加一个初始化式,给出以下固定代码:

friendList.setModel(new javax.swing.AbstractListModel() {
    URL url = getClass().getResource("friends");
    File folder = new File(url.getPath());
    File[] listOfFiles = folder.listFiles();
    String[] elements = new String[listOfFiles.length];
    {
        for(int i=0; i<listOfFiles.length;i++) {
            elements[i] = (listOfFiles[i].getName());
    }
}

最新更新