2015-09-09 11 views
1

Я не программирую в java, но решил попробовать его, создав jframe в netbeans. В автогенерируемой InitComponent() метод это для петли не запускается, говоря мне следующие вещи:Почему этот простой цикл терпит неудачу в netbeans, java (JFRAME)?

  • незаконного начало типа
  • не может найти символ: класс я

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

    Может кто-нибудь объясняет?

+0

Это выглядит вы пытаетесь определить исполняемый код на стороне исполняемого контекста (метод или конструктор) – MadProgrammer

+0

Если вы используете 'URL url = getClass(). getResource (« friends »);', then 'File folder = new File (url. getPath()); 'бессмысленно, так как ресурс может быть недоступен как файл – MadProgrammer

+0

Ну, я понимаю, что проблема с циклом заключается в том, что он не может быть выполнен в initComponent(). Благодарю. – Blackb3ard

ответ

1

Проблема в том, что вы пытаетесь вызвать цикл 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()); 
    } 
} 
+0

Ahh благодарит Джеймса, это был хороший ответ. – Blackb3ard

2

Давайте посмотрим, если мы сможем распутать этот ...

Ваша основная проблема, кажется, что вы пытаетесь определить исполняемый код из стороны исполняемого контекста (метод или конструктор).

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

В качестве примера.

Возможно, вам потребуется больше времени, чтобы изучить основы языка, прежде чем погружать голову в сложность графического интерфейса, и это очень поможет в решении этих проблем ... как дружественное предложение.

Смежные вопросы