2015-03-11 1 views
0

Хорошо, у меня есть проблема, которую я не могу понять, что не так. Поэтому у меня есть jList и List. Мне нужна функция, которая когда я нажимаю на элемент (в jList любом элементе), и он изменился бы на мой значок ярлыка (я имею дело с изображениями). Он работает как-то, он меняет значок ярлыка на изображение, которое я выбираю из jList, но это бросает меня Исключение, и программа вылетает, как правило, первые 2 элемента не вызывают ошибок, из-за чего возникают третьи и другие элементы. После того, как он падает и бросает мне кучу красного текста, я все равно могу изменить свой значок.Индекс массива Java Out Of Bounds Исключение: -1

Это функция, где я получаю изображения и добавить их в список (добавление пути к ним)

private static void getImages(String src) throws IOException { 
    //Exctract the name of the image from the src attribute 
    int indexname = src.lastIndexOf("/"); 

    if (indexname == src.length()) { 
     src = src.substring(1, indexname); 
    } 

    indexname = src.lastIndexOf("/"); 
    String name = src.substring(indexname, src.length()); 

    //Open a URL Stream 
    URL url = new URL(src); 
    InputStream in = url.openStream(); 

    GPath=fPath+name; 
    OutputStream out = new BufferedOutputStream(new FileOutputStream(GPath)); 
    //Im adding to the list string (link to image) here 
    imagesListN.add(GPath); 

    System.out.println("list size: "+imagesListN.size()); 


    for (int b; (b = in.read()) != -1;) { 

     out.write(b); 
    } 

    out.close(); 
    in.close(); 

} 

Он добавляет их в обычном режиме. Да, я загружаю их, поэтому я хочу их увидеть, как только они будут загружены.

Здесь я нажимаю на функцию jList.

 list.addListSelectionListener(new ListSelectionListener() { 

     private int a; 

     @Override 
     public void valueChanged(ListSelectionEvent arg0) { 
      if (!arg0.getValueIsAdjusting()) { 
       String h; 
       int k; 
       k = list.getSelectedIndex(); 
       System.out.println("List id: "+k); 
       a = Main.imagesListN.indexOf(k); 
       System.out.println("imagesListN id: "+a); 

       h = Main.imagesListN.get(k); 
       System.out.println("h : "+h); 
       ImageIcon img = new ImageIcon(h); 

       imageReview.setIcon(img); 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 

Это jList (список имен). Исключение составляет

a = Main.imagesListN.indexOf (k);

это дает мне -1, но h = Main.imagesListN.get (k); дает мне ссылку, которая мне нужна, и дает ее ImageIcon img = new ImageIcon (h);, а затем imageReview.setIcon (img);. Значок метки меняется каждый раз, когда я нажимаю на элемент, который мне нужен. Может быть, это не a = Main.imagesListN.indexOf (k);, на который я смотрю, но что-то дает мне -1. Btw Я использую все в Thread.

`public class Crawler extends Thread { 

Main main = new Main(); 

public void run(){ 
     try { 
       main.download(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

}` 

ничего необычного здесь. Каждая функция находится в собственном классе, getImages() в основном, listListener в классе Langas (класс, где все кнопки, метки и т. Д. Больше ничего не создаются) и Thread хорошо, Thread. Также он отлично работает после того, как все загружено, никаких исключений. Появляется ошибка durring downloading proccess

+0

Post достаточноt код поэтому можем воспроизвести. –

+0

Пожалуйста, посмотрите на этот кусок кода и редактировать ваши ... 'общественности недействительным ValueChanged (ListSelectionEvent е) { если (e.getValueIsAdjusting() == FALSE) { если (list.getSelectedIndex() = = -1) { // Нет выбора, отключить кнопку огня. fireButton.setEnabled (false); } else { // Выбор, включение кнопки огня. fireButton.setEnabled (true); } } } ' –

+0

Даже если я прокомментирую a = Main.imagesListN.indexOf (k); Он по-прежнему показывает ту же ошибку – Gaxt

ответ

0

indexOf api принимает объект как параметр, а get принимает объекты, а также примитивные типы. Поэтому, когда вы вызываете get с примитивным типом, он ищет элемент по индексу, который вы, возможно, нашли.

Но когда вы делаете indexOf, вы ищете объект в своем списке и, следовательно, получаете -1.