Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JList.remove(int) странная ошибка, JList не удаляет елемент по индексу. 
:(
    Опции темы
zxxz
Дата 18.8.2011, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 27.10.2010

Репутация: нет
Всего: нет



JLisт remove метод не работает. Есть код вполне стандартный:
Button для удалeния выбранного елемента из JList
Код

public void actionPerformed(ActionEvent e) {

                // int index = projectList.getSelectedIndex();
                int size = projectModel.getSize();//projectModel = DefaultListModel
                System.out.println(pIndex + ":" + size);// здесь все нормально выводит.
//А тут начинает чудить. Назавем эту строку "чудной"
                if (pIndex > -1 && pIndex >= size - 1) {//если убрать проверку, кидает ArrayIndexOutOfBoundsException
                    Object el = projectModel.getElementAt(pIndex);
                    projectModel.removeElement(el);
                    //projectModel.remove(pIndex);//так тоже пробовал(с самого начала)

//тут еще код который не выполняется так как тоже должен получать елемент по индексу.....
} else {
                   System.out.println("Inside else"+pIndex + ":" + size);
}


pIndex получаю при обработке valueChanged
Код


public void valueChanged(ListSelectionEvent e) {
            if (e.getSource() == projectList) {
 if (projectList.getValueIsAdjusting() == false) {
 pIndex = projectList.getSelectedIndex();
//......

run в NetBean получаем что то вроде
4:9
Inside else4:9

Получается что до "чудной" строки все нормально а потом индекс куда то проподает. 
А если убрать проверку индекса то получаем:
3:9
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
        at java.util.Vector.elementData(Vector.java:730)
        at java.util.Vector.elementAt(Vector.java:473)
        at javax.swing.DefaultListModel.getElementAt(DefaultListModel.java:89)
        at gui.BackupperMainFrame$GuiUtil.valueChanged(BackupperMainFrame.java:666)....
...и много ещё чего не понятного smile
Moжет кто-нибудь встречал уже такое безобразие? А то я уже паникую и впадаю в отчаянье smile

У меня jdk 1.7.0 закаченная с Oracle.


Это сообщение отредактировал(а) zxxz - 18.8.2011, 23:02
PM MAIL WWW   Вверх
pathfinder
Дата 19.8.2011, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 7
Всего: 10



Цитата(zxxz @  18.8.2011,  23:01 Найти цитируемый пост)
if (pIndex > -1 && pIndex >= size - 1) 


заменить на

Цитата(zxxz @  18.8.2011,  23:01 Найти цитируемый пост)
if (pIndex > -1 && pIndex <= size - 1) 

PM MAIL   Вверх
zxxz
Дата 19.8.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 27.10.2010

Репутация: нет
Всего: нет



Заменил:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
        at java.util.Vector.elementData(Vector.java:730)
        at java.util.Vector.elementAt(Vector.java:473)
        at javax.swing.DefaultListModel.getElementAt(DefaultListModel.java:89)
        at gui.BackupperMainFrame$GuiUtil.valueChanged(BackupperMainFrame.java:666)
        at javax.swing.JList.fireSelectionValueChanged(JList.java:1798)
        at javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1812)
        at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:184)
        at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:164)
        at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:211)
        at javax.swing.DefaultListSelectionModel.removeIndexInterval(DefaultListSelectionModel.java:677)
        
эх....
Не ну я бы понял, у меня где то ошибку кидал. Может ант глючит?
Хотя скомпилировал и попробовал тоже самое.
Жалко не могу попробовать под java1.6 - много переписывать надо будет.
PM MAIL WWW   Вверх
pathfinder
Дата 19.8.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 7
Всего: 10



Их stacktrace видно что exception возникает в методе valueChanged, а не в actionPerformed.
 
Цитата(zxxz @  19.8.2011,  11:43 Найти цитируемый пост)
        at java.util.Vector.elementData(Vector.java:730)
        at java.util.Vector.elementAt(Vector.java:473)
        at javax.swing.DefaultListModel.getElementAt(DefaultListModel.java:89)
        at gui.BackupperMainFrame$GuiUtil.valueChanged(BackupperMainFrame.java:666)


PM MAIL   Вверх
zxxz
Дата 19.8.2011, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 27.10.2010

Репутация: нет
Всего: нет



На английском, о грустном. smile 
http://www.javaworld.com/javaworld/jw-08-2...-exception.html
PM MAIL WWW   Вверх
dorogoyIV
Дата 19.8.2011, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



zxxz, да эта статейка тут кажется ни при чем...
где то ты сам проворонил...
например вместо переменной size, напиши list.size() ... (я имею ввиду - возможно размер коллекции изменился к этому моменту)
может быть еще где то что то пропустил...
а если JList, так этот метод вообще не подходит...
removeSelectionInterval(int index0, int index1)

Это сообщение отредактировал(а) dorogoyIV - 19.8.2011, 22:45
PM MAIL   Вверх
zxxz
Дата 20.8.2011, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 27.10.2010

Репутация: нет
Всего: нет



Не было ни какой проверки она по просу тут не нужна есть кнопка для удаления пока елемент не выбран она не активна.
После того как какой то елемент выбран т.е getSelectedIndex уже что то более -1 всё это и происходит.
pIndex переменная тоже не нужна. Но я почитав exception stack решил попробовать сохранять значение на момент выбора.
Ну или по крайней мере в ближайшей точке. Жалко не успею сейчас разобраться, а потом бог его знает когда руки дойдут.

"я имею ввиду - возможно размер коллекции изменился к этому моменту"-почему? Если принять во внимание, что все
в одном потоке? Или нет?

Это сообщение отредактировал(а) zxxz - 20.8.2011, 01:41
PM MAIL WWW   Вверх
dorogoyIV
Дата 20.8.2011, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



zxxz, прочитай последние две мои строки.
и попробуй так:
Код

 projectModel.removeSelectionInterval(pIndex, pIndex);


Код

 DefaultListModel dlm = (DefaultListModel)projectModel.getModel();


Это сообщение отредактировал(а) dorogoyIV - 20.8.2011, 02:04
PM MAIL   Вверх
zxxz
Дата 20.8.2011, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 27.10.2010

Репутация: нет
Всего: нет



Я не уверен что правельно понял. Но у меня так:
Код

DefaultListModel projectModel = new DefaultListModel();//в конструкторе
//Переписал так:

DefaultListModel projectModel  = (DefaultListModel) porjectList.getModel();
projectList = new JList(projectModel);


Теперь на меня ругается:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at gui.BackupperMainFrame.initProjectPanel(BackupperMainFrame.java:342)
        at gui.BackupperMainFrame.initListPanel(BackupperMainFrame.java:508)
        at gui.BackupperMainFrame.mainInit(BackupperMainFrame.java:137)
        at gui.BackupperMainFrame.<init>(BackupperMainFrame.java:100)
        at backuppeer.Main$1.run(Main.java:18)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
        at java.awt.EventQueue.access$000(EventQueue.java:101)
        at java.awt.EventQueue$3.run(EventQueue.java:666)
        at java.awt.EventQueue$3.run(EventQueue.java:664)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Тут в тему:
http://weblogs.java.net/blog/kgh/archive/2...threaded_t.html
Иначе куда бы переменная пропадала на время, а потом опять появлялась.

Это сообщение отредактировал(а) zxxz - 20.8.2011, 02:53
PM MAIL WWW   Вверх
dorogoyIV
Дата 21.8.2011, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



что такое projectModel?
из первого сообщения видно, что это Vector (иначе бы не скомпилировался этот код) , причем тогда JList?
если это не Vector, то как такое может работать: projectModel.removeElement(el);
PM MAIL   Вверх
dorogoyIV
Дата 22.8.2011, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



да, не работает метод removeSelectionInterval(int index0, int index1)
такой костыль можно вставить:
Код

import java.awt.event.*;
import javax.swing.*;

public class Test extends JFrame
                  implements MouseListener
{
 private JList jlist = new JList();

 public Test()
 {
  setBounds(100, 100, 400, 300);
  setDefaultCloseOperation(3);

  Object [] data = new Object [10];

  for(int i = 0; i < data.length; i++)
   data [i] = i;

  jlist.setListData(data);
  jlist.addMouseListener(this);
  add(jlist);
 }

 private void removeElement()
 {
  int index = jlist.getSelectedIndex();
  ListModel lm = jlist.getModel();

  if(lm.getSize() > 0)
  {
   Object [] data = new Object [lm.getSize() - 1];

   for(int i = 0, j = 0; i < lm.getSize(); i++)
    if(i != index)
    {
     data [j] = lm.getElementAt(i);
     j++;
    }
   jlist.setListData(data);
  }
 }

 public void mouseEntered(MouseEvent e){}
 public void mouseExited(MouseEvent e){}
 public void mousePressed(MouseEvent e){}
 public void mouseReleased(MouseEvent e)
 {
  removeElement();
 }
 public void mouseClicked(MouseEvent e){}

 public static void main(String [] args)
 {
  SwingUtilities.invokeLater(new Runnable()
  {
   public void run()
   {
    new Test().setVisible(true);
   }
  });
 }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.