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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение ячейки в JTable 
:(
    Опции темы
lavan
Дата 22.9.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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()???

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


Шустрый
*


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

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



Код

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

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


Шустрый
*


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

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



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

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

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


 




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


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

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