Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Определение ячейки в JTable


Автор: lavan 22.9.2011, 12:47
Казалось бы простая задача...а нет.Хочу получить значение и номер ячейки
которую выбрал пользователь.читаю в книге:"Для того чтобы выбрать ячейку 
можно использовать
Код

JTable jt.setCellSelectionEnabled(true);//выделяется только ячейка

Дальше,существует событие "выбор столбца" и "выбор ряда" для того чтобы
узнать индекс ячейки надо обработать эти два события
Код

ListSelectionModel lmr;
    ListSelectionModel lmc;
    TableColumnModel tcm;
lmr=jt.getSelectionModel();//model for row
        tcm=jt.getColumnModel();
        lmc=tcm.getSelectionModel();//model for colum
        tm=jt.getModel();
        lmc.addListSelectionListener(new PrCol());
        lmr.addListSelectionListener(new PrRow());
.....
class PrCol implements ListSelectionListener{//        1 обработчик
        public void valueChanged(ListSelectionEvent le){
            col=jt.getSelectedColumn();
            row=jt.getSelectedRow();//Здесь вернется -1
//Нехватает информации чтобы методом tm.getValueAt(row, col); получить
//значение таблицы
        }
    }
    class PrRow implements ListSelectionListener{//         2 обработчик
        public void valueChanged(ListSelectionEvent le){
            row=jt.getSelectedRow();
            col=jt.getSelectedColumn();//Здесь вернется -1
//Нехватает информации чтобы методом tm.getValueAt(row, col); получить
//значение таблицы
        }
    }

В принципе получить значение используя этот код можно,но только после 
второго нажатия по ячейке или (бывает можно обойтись и без этого)но 
тогда бросается исключение что имеется отриц индекс дальше идет заход
во второй обработчик и нужные знач появляются.Хоть это прозрачно для пользователя
 ЭТО НЕ ПРАВИЛЬНО!
Решил исправить ситуацию,добавил метод
Код

if(le.getValueIsAdjusting())return;

Для чего?По скольку метод возвращает true если выбор еще происходит,а
при выборе ячейки происходит два события,то полагал что при возникнов
только одного из них метод вернет true а значит если объеденить два
обработчика в один должно все сработать.Т.е ожидаю:
нажатие на ячейке->событие выбор столбца,заход в обработчик,выход 
из него по if(le.getValueIsAdjusting())return;-заход в тот же обработчик 
по событию выбор ряда и здесь(по моему мнению) метод le.getValueIsAdjusting()
должен был вернуть false...но нет происходит еще один заход в обработчик и 
только на нем метод возвращает false

Код

lmc.addListSelectionListener(new PrCol());
        lmr.addListSelectionListener(new PrCol());
class PrCol implements ListSelectionListener{
        public void valueChanged(ListSelectionEvent le){
            c++;//                          проверял кол-во заходов
            if(le.getValueIsAdjusting())return;
            col=jt.getSelectedColumn();
            row=jt.getSelectedRow();
         String s=(String)tm.getValueAt(row, col);
         jl.setText(s+" "+row+" "+col);
        }
    }

1)КАК все таки правильно получить значение ячейки????
2)В чем ошибка рассуждений при использовании метода le.getValueIsAdjusting()???

Автор: pathfinder 22.9.2011, 13:48
Код

        ListSelectionListener lsl = new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (e.getValueIsAdjusting()) {
                    return ;
                }
                
                int row = jTable1.getSelectionModel().getLeadSelectionIndex();
                int col = jTable1.getColumnModel().getSelectionModel().getLeadSelectionIndex();
                
                if (p.x != row || p.y != col) {
                    p.move(row, col);
                    System.out.println(p);
                }
            }
          
            private Point p = new Point(-1, -1);
        };
        
        jTable1.getSelectionModel().addListSelectionListener(lsl);
        jTable1.getColumnModel().getSelectionModel().addListSelectionListener(lsl);

Автор: lavan 22.9.2011, 14:11
Прокомментируйте пож

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)