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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отследить потерю фокуса ячейки JTable 
V
    Опции темы
Tsahes
Дата 24.8.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Посоветуйте, как отловить событие потери фокуса ячейки JTаble?

На панели расположены текстовое поле JTextField и таблица JTable с редактируемыми ячейками.
Начинаю редактировать ячейку, что-то ввожу и мышкой нажимаю на текстовое поле. Фокус теперь на текстовом поле. А вот ячейка таблицы по прежнему остается в режиме редактирования. Соответственно, метод
Код

ListSelectionListener.valueChanged(ListSelectionEvent e)

не отрабатывает.
Я посмотрел, использование таблицей JTable слушателя
Код

FocusListener.focusLost(FocusEvent e) 

также не позволяет отследить подобную утрату фокуса.
PM MAIL   Вверх
dorogoyIV
Дата 26.8.2007, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


Новичок



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

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



Проблема оказалась в нестандартном поведении редактора яцейки таблицы, и я не первый, кто с ней столкнулся. Вечером я опишу ее решение.
PM MAIL   Вверх
Tsahes
Дата 31.8.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Итак, тестовый пример.
Добавление: выбираем ячейку таблицы для редактирования, а затем сразу кликаем мышкой на текстовое поле. Как видно, потеря фокуса редактируемой ячейки будет отслежена.

Код

import java.awt.Component;
import java.awt.Dimension;
import java.util.Date;

import javax.swing.AbstractCellEditor;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;

public class TestTableCell {

    public static void main(String[] args) {
        new TestTableCell().createForm();
    }

    public void createForm() {
        JFrame frame = new JFrame("SimpleTableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();

        JTable table = new JTable();
        table.setModel(new MyTableModel());
        table.setDefaultEditor(String.class, new MoneyTextCellEditor());
        /**
         * Настройка поведения редактируемой ячейки при потере фокуса, подробности в google.
         */
        table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));

        JTextField textField = new JTextField();
        textField.setPreferredSize(new Dimension(100, 18));

        panel.add(table);
        panel.add(textField);

        frame.setContentPane(panel);

        frame.pack();
        frame.setVisible(true);
    }

    private void focusLostHandler() {
        System.out.println("Focus lost on " + new Date());
    }

    private class MoneyTextCellEditor extends AbstractCellEditor implements TableCellEditor {

        private JTextField editor;

        public MoneyTextCellEditor() {
            editor = new JTextField();
        }

        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
            editor.setText(value.toString());

            return editor;
        }

        public Object getCellEditorValue() {
            String editorValue = editor.getText();

            return editorValue;
        }

        protected void fireEditingStopped() {
            super.fireEditingStopped();

            editor.setText("");
            focusLostHandler();
        }
    }

    private class MyTableModel extends AbstractTableModel {

        private String[] columnNames = { "First Name", "Last Name" };

        private Object[][] data = { { "Mary", "Campione" }, { "Alison", "Huml" } };

        public int getColumnCount() {
            return columnNames.length;
        }

        public int getRowCount() {
            return data.length;
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        public boolean isCellEditable(int row, int col) {
            return true;
        }
    }
}




Это сообщение отредактировал(а) Tsahes - 31.8.2007, 15:00
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.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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