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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> InputVerifier на отдельную клетку в JTable 
V
    Опции темы
Dims
Дата 14.12.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Как проще всего сделать, чтобы пользователь мог вводить в клетки JTable только целые числа (то есть, строки, состоящие только из цифр).

В интернете нашёл несколько примеров наложение InputVerifier на клетку, но как-то они мне кажутся излишне сложными: расширяются сразу несколько классов, включая JTable. Нельзя ли расширять поменьше классов?
PM MAIL   Вверх
goodday1941
Дата 14.12.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



гм.... в общем при заливке данных в модел писать что то по типу:

data[i][j] = new Integer();

Это сообщение отредактировал(а) goodday1941 - 14.12.2007, 16:23


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Dims
Дата 14.12.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А у меня данные не заливаются, их пользователь вводит. 
PM MAIL   Вверх
goodday1941
Дата 14.12.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

public class Test extends JFrame {

    public Test() {
        add(new JTable(new TableModel()));
        setVisible(true);
    }

    public static void main (String [] args){
        new Test();
    }

    private Object [][] getData(){
        Object [][] data = new Object[3][3];
        for (int i = 0; i<3; i++){
            data[i][0] = new String("a");
            data[i][1] = new String("b");
            data[i][2] = new String("c");
            data[i][i] = new Integer(0);
        }
        return data;
    }

    private class TableModel extends AbstractTableModel {
        public static final int COLUMN_FILTER_NAME = 0;
        public static final int COLUMN_FILTER_ID = 1;

        public static final int COLUMNS_COUNT = 1;

        private String[] columnNames = new String[]{
                "1" , "2" , "3"
        };

        private Object[][] data = getData();

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

        public void fireTableDataChanged() {
            data = getData();
        }

        public int getColumnCount() {
            return 3;
        }

        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 void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
        }

        public Class getColumnClass(int c) {
            if (getValueAt(0, c) == null) {
                return String.class;
            } else return getValueAt(0, c).getClass();
        }

        public int getRowID(int id) {
            return 0;
        }
    }
}



Добавлено через 4 минуты и 39 секунд
мда тут ньюансы... сразу на всю колонку прописываем Integer, а не на ячейку :(

Добавлено через 5 минут и 19 секунд
тоесть с колонкой просто, с ячейкой мутно  smile 


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Dims
Дата 14.12.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



И что должно получиться, расшифруй пожалуйста? Что будет, если пользователь введёт в клетку не число, а букву?
PM MAIL   Вверх
Kangaroo
Дата 14.12.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

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



Цитата(Dims @  14.12.2007,  15:42 Найти цитируемый пост)
И что должно получиться, расшифруй пожалуйста? Что будет, если пользователь введёт в клетку не число, а букву?

Не будет проходить "коммит" нового значения. То есть пользователь может вводить всякую фигню, но останется старое значение.


--------------------
Lost....
PM MAIL MSN   Вверх
goodday1941
Дата 14.12.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Kangaroo @  14.12.2007,  16:44 Найти цитируемый пост)
Не будет проходить "коммит" нового значения. То есть пользователь может вводить всякую фигню, но останется старое значение.

именно так... ячейка выделяеться красным и не выходит с состояния эдит smile

Добавлено через 3 минуты и 56 секунд
я тут малек подправил один из методов модели

public Class getColumnClass(int c) {
        if (c==0) return Integer.class
else return String.class;
}
}

вот тут как раз и задаеться тип каждой колонки....
 в данном случае в первой колонке тип Integer а во всех остальных - String

Добавлено через 11 минут и 23 секунды
Код

public class SynchTest extends JFrame {

    public SynchTest() {
        add(new JTable(new TableModel()));
        setVisible(true);
    }

    public static void main (String [] args){
        new SynchTest();
    }

    private Object [][] getData(){
        Object [][] data = new Object[3][3];
        for (int i = 0; i<3; i++){
            data[i][0] = null;
            data[i][1] = null;
            data[i][2] = null;
        }
        return data;
    }

    private class TableModel extends AbstractTableModel {
        public static final int COLUMN_FILTER_NAME = 0;
        public static final int COLUMN_FILTER_ID = 1;

        public static final int COLUMNS_COUNT = 1;

        private String[] columnNames = new String[]{
                "1" , "2" , "3"
        };

        private Object[][] data = getData();

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

        public void fireTableDataChanged() {
            data = getData();
        }

        public int getColumnCount() {
            return 3;
        }

        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 void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
        }

        public Class getColumnClass(int c) {
            if (c==0) return Float.class;
            else if (c == 1) return Integer.class;
            else return String.class;
        }

        public int getRowID(int id) {
            return 0;
        }
    }
}


вот окончательный пример  smile 


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Dims
Дата 14.12.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Kangaroo @  14.12.2007,  16:44 Найти цитируемый пост)
Не будет проходить "коммит" нового значения.

А почему? В каком месте это произойдёт?

PM MAIL   Вверх
goodday1941
Дата 14.12.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если вводимое значение соответствует типу данных которые должны находиться в этой ячейке то пройдет комит, так же комит пройдет если ячейка пуста... в других случая комит не пройдет

Добавлено через 5 минут и 10 секунд
лучше всего запустите последний пример, сразу все поймете


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Dims
Дата 14.12.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Всё же я не совсем понял. Допустим, пользователь ввёл 12,0. Соответствует ли это типу или нет? Это ведь можно интерпретировать как целое число с нулевой дробной частью в русской записи, как два числа через запятую в английской.

Где происходит проверка?

Где определяется тип? В getColumnClass?

Тогда, получается, достаточно просто переопределить getColumnClass написав наследника от DefaultTableModel?

Добавлено через 4 минуты и 13 секунд
Я скомпилировал ваш пример и у меня получается вводить что угодно куда угодно.

Добавлено через 5 минут и 36 секунд
А, нет, в первую колонку не получается вводит нецелые числа.
А почему?
PM MAIL   Вверх
goodday1941
Дата 14.12.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



public Class getColumnClass(int c) {
            if (c==0) return Float.class;
            else if (c == 1) return Integer.class;
            else return String.class;
        }
первоя колонка - Float
вторая - Integer
третья - String

Добавлено через 1 минуту и 8 секунд
Цитата(Dims @  14.12.2007,  17:25 Найти цитируемый пост)
Тогда, получается, достаточно просто переопределить getColumnClass написав наследника от DefaultTableModel?

именно так

я это и сделал, только наследовался от AbstractTableModel

Добавлено через 1 минуту и 47 секунд
ПС. скопируйте последний пример, я там поизменял слегка smile

Добавлено через 3 минуты
12,0 - естественно это Флоат


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Dims
Дата 14.12.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



В общем, у меня однострочная таблица. И ещё я хочу, чтобы последняя клеточка оставалась пустая для возможности добавить в неё дополнительное значение. 

Я сделал вот так

Код

public class UserInputTableModel
    extends AbstractTableModel {
      
   private final int maxsize = 12;

    private Sequence seq = new Sequence();

    public UserInputTableModel() {
    }

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

    public int getRowCount() {
        return 1;
    }

    public int getColumnCount() {
      if( seq.size() < maxsize ) {
            return seq.size() + 1;
        }
      else {
         return seq.size();
      }
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        if (columnIndex == seq.size()) {
            return null;
        }
        else {
            return seq.get(columnIndex);
        }
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      if( columnIndex == seq.size() ) {
         seq.add( (Long) aValue );
      }
      else {
            seq.set(columnIndex, (Long) aValue);
        }
    }

    public Class getColumnClass(int c) {
        return Long.class;
    }
}


Sequence это класс extends Vector<Long> -- строчка из чисел типа Long.

Вроде бы, получилось добавлять одну виртуальную клеточку. Но беда в том, что после расширения seq визуально клеточка не добавляется. 

Наверное, надо как-то какое-то событие выбросить, да?

Добавлено через 5 минут и 49 секунд
Сделал вот так

Код


public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      if( columnIndex == seq.size() ) {
         seq.add( (Long) aValue );
         fireTableChanged( new TableModelEvent( this) );
      }
      else {
            seq.set(columnIndex, (Long) aValue);
        }
    }


не сработало :(

Добавлено через 8 минут и 29 секунд
Помогло fireTableStructureChanged();

Это правильно?

Добавлено через 12 минут и 31 секунду
В общем, по исходному вопросу спасибо -- отличный метод!

Это сообщение отредактировал(а) Dims - 14.12.2007, 17:55
PM MAIL   Вверх
goodday1941
Дата 14.12.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если честно не понял что Вы хотите сделать

Добавлено через 1 минуту и 39 секунд
а типо если у вас таблица из трек строк, то после того как во все строки были введены значения добавлять еще одну строку?


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Kangaroo
Дата 14.12.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

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



Цитата(Dims @  14.12.2007,  16:53 Найти цитируемый пост)
Помогло fireTableStructureChanged();

Это правильно?

Да. 
Тут структура таблицы изменилась - вызываем fireTableStructureChanged(), а когда данные fireTableDataChanged. И еще там пару есть. 

Исходники его посмотрите, все сразу станет понятно.


--------------------
Lost....
PM MAIL MSN   Вверх
goodday1941
Дата 14.12.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



все понял smile ну собсно ответ уже дан


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


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

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