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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Listener на ячейку таблицы? Обработка клика на конкретной ячейке 
:(
    Опции темы
BlHol
Дата 11.1.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



День добрый!
Вопрос такой. Создал таблицу, заполнил. Теперь нужно на ячейку таблицы повесить листенер, действия в котором, выполняются в зависимости от значения в ячейке. Вопрос - как?
Если можно, общий алгоритм и пару методов. 
Заранее спасибо.
С уважением.
PM MAIL   Вверх
fixxer
Дата 11.1.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

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



Можно usecase поподробнее, что именно нужно и в какой момент?

Это сообщение отредактировал(а) fixxer - 11.1.2009, 17:03


--------------------
user posted image
PM MAIL ICQ   Вверх
BlHol
Дата 11.1.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(fixxer @ 11.1.2009,  17:03)
Можно usecase поподробнее, что именно нужно и в какой момент?

Вобщем ситуация такая. Есть таблица с различными значениями. Если ячейка содержит значение отличное от нуля, то при клике на ней должна разворачиваться (под данной таблицей) еще одна таблица с расшифровкой данного значения ячейки.
Заранее спасибо.
PM MAIL   Вверх
fixxer
Дата 11.1.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

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



если я правильно понял, что речь идет о JTable (кстати в таком случае вопрос стоит задать в разделе по Java GUI), то можно повесится на изменение выделения строк (JTable#getSelectionModel().addSelectionListener(...)) и на изменение выделения колонок (JTable#getColumnModel().addColumnModelListener(...)). Можно объединить эти два листенера в одном классе и при изменении выделения проверять значение в модели таблицы и действовать соответствующим образом.


--------------------
user posted image
PM MAIL ICQ   Вверх
skif18
  Дата 12.1.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 358
Регистрация: 17.5.2007
Где: Молдова, Кишинев

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



fixxer, а примерчик или ссылку на что-то подобное не подбросишь? Автор опередил с темой ...   smile 


--------------------

PM MAIL ICQ   Вверх
LSD
Дата 13.1.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Ещё как вариант можно использовать MouseListener и rowAtPoint() + columnAtPoint() (поищи по форуму, примеры как их использовать я уже давал).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
BlHol
Дата 14.1.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(LSD @ 13.1.2009,  15:40)
Ещё как вариант можно использовать MouseListener и rowAtPoint() + columnAtPoint() (поищи по форуму, примеры как их использовать я уже давал).

Спасибо. Попробую. Хотя, честно говоря, получилось через MouseListener, повешеным на таблицу с оценкой выделенной строки и столбца. 
Теперь появилась новая проблема. Нужно те ячейки, где число отличное от нуля как-то выделить (цветом, жирным шрифтом и т.д.). Усложняется все тем, что в таблице не только числовые данные. Причем, в разных строках  и ячейках.

Заранее спасибо.
С уважением.

Это сообщение отредактировал(а) BlHol - 14.1.2009, 13:09
PM MAIL   Вверх
Connie
Дата 14.1.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



BlHol, а рендер с этим не справится?
http://java.sun.com/docs/books/tutorial/ui...e.html#renderer
PM MAIL WWW   Вверх
fixxer
Дата 14.1.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

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



Код

public class JTableTest {

    public static void main(String[] args) {
        JFrame frame = new JFrame("JTable test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JTable table = new JTable(new Object[][]{
                    {0, "test1", "test2"},
                    {"test3", 1, "test4"},
                    {"test5", "test6", 2}},
                new String[]{"one", "two", "three"}
                );

        final JLabel label = new JLabel("info");

        ListSelectionListener listener = new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    Object value = table.getModel().getValueAt(
                            table.getSelectedRow(), table.getSelectedColumn());
                    label.setText(value + " " + value.getClass().getSimpleName());
                }
            }
        };

        table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.getSelectionModel().addListSelectionListener(listener);
        table.getColumnModel().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.getColumnModel().getSelectionModel().addListSelectionListener(listener);

        table.setDefaultRenderer(Object.class, new BoldCellRenderer());

        frame.getContentPane().add(new JScrollPane(table));
        frame.getContentPane().add(label, BorderLayout.SOUTH);

        frame.setBounds(100, 100, 640, 480);
        frame.setVisible(true);
    }

    private static class BoldCellRenderer extends DefaultTableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if (value instanceof Integer && ((Integer) value) > 0) {
                c.setFont(c.getFont().deriveFont(Font.BOLD));
            }
            return c;
        }

    }

}



--------------------
user posted image
PM MAIL ICQ   Вверх
BlHol
Дата 14.1.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо! Реально, грамотно!
Сейчас, чуть подкорректирую и в код.

Еще раз, огроменнейшее спасибо!
PM MAIL   Вверх
BlHol
Дата 14.1.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



fixxer
Еще один вопросик, если Вас не затруднит.
Все, в общем, понятно.

Код

        table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.getSelectionModel().addListSelectionListener(listener);
        table.getColumnModel().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.getColumnModel().getSelectionModel().addListSelectionListener(listener);


Не совсем понятна необходимость повторного навешивания Листенера и повторной установки выделения  (3 и 4 строки)


И еще один вопросик.
Есть ли смысл написать класс, который будет рендерить любую таблицу (в зависимости, скажем, от некоего флага), переданную в него или лучше просто каждый раз навешивать на новую таблицу новый рендерер?


С уважением.

Это сообщение отредактировал(а) BlHol - 14.1.2009, 20:33
PM MAIL   Вверх
fixxer
Дата 15.1.2009, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

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



Цитата(BlHol @ 14.1.2009,  17:38)
fixxer
Еще один вопросик, если Вас не затруднит.
Все, в общем, понятно.

Код

        table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.getSelectionModel().addListSelectionListener(listener);
        table.getColumnModel().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.getColumnModel().getSelectionModel().addListSelectionListener(listener);


Не совсем понятна необходимость повторного навешивания Листенера и повторной установки выделения  (3 и 4 строки)


И еще один вопросик.
Есть ли смысл написать класс, который будет рендерить любую таблицу (в зависимости, скажем, от некоего флага), переданную в него или лучше просто каждый раз навешивать на новую таблицу новый рендерер?


С уважением.

Внимательнее! Листенер присоединяется к различным источникам, изменение выделения сторок и выделения колонок, соответственно.

По-поводу универсальности. Зачастую универсальные классы замусориваются в процесе разработки деталями и адаптациями к конкретным решениям. Думаю, что полезно руководствоваться тем, что класс должен хорошо выполнять одну конкретную хорошо очерченую задачу. (Single Responsibility). Но единого ответа тут быть не может - нужно  решать в каждом конкретном случае.


--------------------
user posted image
PM MAIL ICQ   Вверх
math64
Дата 15.1.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Нужно добавить TableModelListener (если есть возможность редактирования таблицы):
Код

class TableSelectionListener implements ListeSelectionListener, TableModelListener {
   JTable table;
   JLabel label;
   int row, col;
   Object value;
   public TableSelectionListener(JTable table, JLabel label) {
     this.table = table;
     this.label = label;
     table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     table.getSelectionModel().addListSelectionListener(this);
     table.getColumnModel().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     table.getColumnModel().getSelectionModel().addListSelectionListener(this);
     table.getModel().addTableModelListener(this);
   }
   public void valueChanged(ListSelectionEvent e) {
       if (!e.getValueIsAdjusting()) {
         row = table.getSelectedRow();
         col = table.getSelectedColumn();
         showValue(table.getModel().getValueAt(row, col));
       }
    }
    private void showValue(Object newValue) {
       if (newValue == value)
         return;
       value = newValue;
       if (value != null)
         label.setText(value + " " + value.getClass().getSimpleName());
       else
         label.setText("null value");
   }
   public void tableChanged(TableModelEvent e) {
      showValue(table.getModel().getValueAt(row, col));
   }
}

PM   Вверх
BlHol
Дата 15.1.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(fixxer @ 15.1.2009,  01:46)
Внимательнее! Листенер присоединяется к различным источникам, изменение выделения сторок и выделения колонок, соответственно.


Это я видел, что к разным. Просто, в случае с 
Код

table.getColumnModel().getSelectionModel().addListSelectionListener(listener);

понятно, что вешается на столбец.
А в случае с 
Код

table.getSelectionModel().addListSelectionListener(listener);

это как-то не очень понятно, куда он вешается...
PM MAIL   Вверх
skif18
Дата 15.1.2009, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 358
Регистрация: 17.5.2007
Где: Молдова, Кишинев

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



Код

jTable.addMouseListener(new java.awt.event.MouseListener() {
                public void mouseReleased(java.awt.event.MouseEvent e) {
                    //  Код действия...
                }

Пользовался этим. Работает.


--------------------

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0840 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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