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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTable + JdbcRowSet 
:(
    Опции темы
moonmike
Дата 25.9.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Коллеги, подскажите плиз, как сделать следующий финт ушами:
Если курсор стоит на последней строке JTable и пользователь настойчиво давит вниз, то надо добавить пустую строку в Модель.
В качестве модели использую нижеприведенный код.
Код

import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;

import javax.sql.RowSet;
import javax.sql.RowSetEvent;
import javax.sql.RowSetListener;
import javax.swing.table.AbstractTableModel;

public class RowSetModel extends AbstractTableModel implements RowSetListener
{
    private RowSet rowSet = null;
    
    public RowSetModel(RowSet set)
    {
        super();
        rowSet = set;
        rowSet.addRowSetListener(this);
    }
    
    public void cursorMoved(RowSetEvent event)
    {
        
        //System.out.println("Сдвинули " + rowSet.isReadOnly());
    }
    
    public Class getColumnClass(int column)
    {
        String cname;
        int type;
        
        try
        {
            ResultSetMetaData meta = rowSet.getMetaData();
            
            if (meta == null)
            {
                return null;
            }
            type = meta.getColumnType(column + 1);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return super.getColumnClass(column);
        }
        switch (type)
        {
            case Types.BIT:
            {
                cname = "java.lang.Boolean";
                break;
            }
            case Types.TINYINT:
            {
                cname = "java.lang.Byte";
                break;
            }
            case Types.SMALLINT:
            {
                cname = "java.lang.Short";
                break;
            }
            case Types.INTEGER:
            {
                cname = "java.lang.Integer";
                break;
            }
            case Types.BIGINT:
            {
                cname = "java.lang.Long";
                break;
            }
            case Types.FLOAT:
            case Types.REAL:
            {
                cname = "java.lang.Float";
                break;
            }
            case Types.DOUBLE:
            {
                cname = "java.lang.Double";
                break;
            }
            case Types.NUMERIC:
            {
                cname = "java.lang.Number";
                break;
            }
            case Types.DECIMAL:
            {
                cname = "java.math.BigDecimal";
                break;
            }
            case Types.CHAR:
            case Types.VARCHAR:
            case Types.LONGVARCHAR:
            {
                cname = "java.lang.String";
                break;
            }
            case Types.DATE:
            {
                cname = "java.sql.Date";
                break;
            }
            case Types.TIME:
            {
                cname = "java.sql.Time";
                break;
            }
            case Types.TIMESTAMP:
            {
                cname = "java.sql.Timestamp";
                break;
            }
            case Types.BINARY:
            case Types.VARBINARY:
            case Types.LONGVARBINARY:
            {
                cname = "byte[]";
                break;
            }
            case Types.OTHER:
            case Types.JAVA_OBJECT:
            {
                cname = "java.lang.Object";
                break;
            }
            case Types.CLOB:
            {
                cname = "java.sql.Clob";
                break;
            }
            case Types.BLOB:
            {
                cname = "java.ssql.Blob";
                break;
            }
            case Types.REF:
            {
                cname = "java.sql.Ref";
                break;
            }
            case Types.STRUCT:
            {
                cname = "java.sql.Struct";
                break;
            }
            default:
            {
                return super.getColumnClass(column);
            }
        }
        try
        {
            return Class.forName(cname);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return super.getColumnClass(column);
        }
    }
    
    public int getColumnCount()
    {
        try
        {
            ResultSetMetaData meta = rowSet.getMetaData();
            
            if (meta == null)
            {
                return 0;
            }
            return meta.getColumnCount();
        }
        catch (SQLException e)
        {
            return 0;
        }
    }
    
    public String getColumnName(int col)
    {
        try
        {
            ResultSetMetaData meta = rowSet.getMetaData();
            
            if (meta == null)
            {
                return null;
            }
            return meta.getColumnName(col + 1);
        }
        catch (SQLException e)
        {
            return "Error";
        }
    }
    
    public int getRowCount()
    {
        try
        {
            if (rowSet.last())
            {
                return (rowSet.getRow());
            }
            else
            {
                return 0;
            }
        }
        catch (SQLException e)
        {
            return 0;
        }
    }
    
    public Object getValueAt(int row, int col)
    {
        try
        {
            if (!rowSet.absolute(row + 1))
            {
                return null;
            }
            return rowSet.getObject(col + 1);
        }
        catch (SQLException e)
        {
            return null;
        }
    }
    
    public void rowChanged(RowSetEvent event)
    {
        try
        {
            int row = rowSet.getRow();
            
            if (rowSet.rowDeleted())
            {
                fireTableRowsDeleted(row, row);
            }
            else if (rowSet.rowInserted())
            {
                fireTableRowsInserted(row, row);
            }
            else if (rowSet.rowUpdated())
            {
                fireTableRowsUpdated(row, row);
            }
        }
        catch (SQLException e)
        {
        }
    }
    
    public void rowSetChanged(RowSetEvent event)
    {
        fireTableStructureChanged();
    }
    
    public void setValueAt(Object value, int row, int column)
    {
        try
        {
            if (!rowSet.absolute(row + 1))
            {
                return;
            }
            rowSet.updateObject(column + 1, value);
        }
        catch (SQLException e)
        {
        }
    }
    
    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        return true;
    }
    
}

PM MAIL   Вверх
powerOn
Дата 25.9.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(moonmike @  25.9.2006,  19:08 Найти цитируемый пост)
пользователь настойчиво давит вниз, то надо добавить пустую строку в Модель.

ну если необходимо добавить строку в модель только для видимости (без добавления в сам источник данных - RowSet), то:
определите логику "ложных строк": Храните в некотором целочисленном поле количество пустых полей. Увеличивайте и уменьшайте это число по необходимости. В методе getRowCount() сделайте возврат суммы числа реальных полей и пустых полей.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
moonmike
Дата 27.9.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(powerOn @ 25.9.2006,  18:49)
Цитата(moonmike @  25.9.2006,  19:08 Найти цитируемый пост)
пользователь настойчиво давит вниз, то надо добавить пустую строку в Модель.

ну если необходимо добавить строку в модель только для видимости (без добавления в сам источник данных - RowSet), то:
определите логику "ложных строк": Храните в некотором целочисленном поле количество пустых полей. Увеличивайте и уменьшайте это число по необходимости. В методе getRowCount() сделайте возврат суммы числа реальных полей и пустых полей.

В общем идея красивая, только вот возникло несколько вопросов. Надо в событии KeyPressed у JTable определять на какой строке сейчас находится курсор, как это сделать ума не приложу=(
PM MAIL   Вверх
powerOn
Дата 27.9.2006, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(moonmike @  27.9.2006,  13:33 Найти цитируемый пост)
 Надо в событии KeyPressed у JTable определять на какой строке сейчас находится курсор


Всмысле? Какая строка сейчас выделена (selected)? Если да, то лучше не на KeyPressed, а на KeyReleased. И сделать это можно с помощью метода getSelectedRow() таблицы.



--------------------
user posted image нет времени думать - нужно писать КОД!

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.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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