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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTable.размер таблицы, ограничение кол-ва строк в JTable 
:(
    Опции темы
izver84
Дата 3.3.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня есть JTable состоящий из 2 - х столбцов. Данные берутся  из базы данных. Если в таблице 50 строк программа запускается. если больше, выдает ошибку Caused by columnNames.length.
JTable расположен на JScrollPanel.

основной класс
Цитата

public class OtmetkaProductii extends JFrame {
private JScrollPane getJScrollPane()  {
  if (jScrollPane == null) {
    jScrollPane = new JScrollPane();
      jScrollPane.setViewportView(getJTable());
  }
  return jScrollPane;
    }

private JTable getJTable() {
  if (jTable == null) {
    jTable = new JTable();
    jTable.setRowSelectionAllowed(true);
    jTable.setCellSelectionEnabled(true);
    jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    jTable.setShowGrid(true);
    jTable.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
    jTable.setPreferredSize(new Dimension(453,419));
    jTable.setModel(getDB());
    jTable.getColumnModel().getColumn(0).setPreferredWidth(30);
    jTable.getColumnModel().getColumn(1).setPreferredWidth(35);
    }
  return jTable;
    }

private database getDB() {
  if (DB == null) {
    DB = new database(
     "SELECT nzprn , pza FROM s_product WHERE zaiavka=1 ORDER BY nzprn",
     "cbit", "***", "***", "s_product");
  }
  return DB;
    }
}


Класс определения Базы Данных

Цитата

public class database extends AbstractTableModel{
public int getColumnCount()
    {
   return columnNames.length;
    }
//подключение к базе
public database(String query, String DBNAME, String USERNAME, String PASSWORD, String tableName)
    {
  this.tableName = tableName;
  fireTableDataChanged();
  Driver d;
  try{
    d = (Driver)Class.forName("org.postgresql.Driver").newInstance();
  }
  catch (Exception e) {
    System.out.println("Error 1");
    System.out.println(e.getStackTrace());
  }
  try{
    con = DriverManager.getConnection
    ("jdbc:postgresql://localhost:5432/"+DBNAME,USERNAME,PASSWORD);
    //    statement =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

  statement = con.createStatement();
  SqlReload(query);
  }
  catch(SQLException e)
  {
    System.out.println(e.getMessage());
  }
    }







--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
AntonSaburov
Дата 3.3.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Во-первых - хорошо бы полное сообщение об ошибке, а не тот огрызок, который непонятен.

Во-вторых
Цитата(izver84 @  3.3.2008,  14:51 Найти цитируемый пост)
public int getColumnCount()
{
return columnNames.length;
}

А это что такое ? По идее надо же нормально реализовать модель. А у тебя какой-то убогий варинат получается. Или приводи полный код.
PM MAIL WWW ICQ   Вверх
izver84
Дата 3.3.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Часть даных были неправильной кодировки, эту проблему я решил. Прога запускается, но выдает все равно примерно 50 строк. Ошибок нет.
AntonSaburov, полный текст класса databases
Цитата

public class database extends AbstractTableModel{
    private static final long serialVersionUID = 1L;
    public String[] columnNames;
    public Vector rows = new Vector();
    public ResultSetMetaData metaData;
    public Statement statement;
    public ResultSet resultSet;
    public Connection con; 
    public String tableName;
    
    public int getColumnCount()
    {
   return columnNames.length;
    }

    public String getColumnName(int n)
    {
   return columnNames[n];
    }
    
    public int getRowCount()
    {
  return rows.size();
    }
    public int addRow()
    {

  int r=rows.size()+1;
  return r;
    }

    public Object getValueAt(int aRow, int aColumn)
    {
  Vector row = (Vector)rows.elementAt(aRow);
  
  return row.elementAt(aColumn);
    }
//-----------------------------------------------------------------------------------------------
    public database(String query, String DBNAME, String USERNAME, String PASSWORD, String tableName)
    {
  this.tableName = tableName;
  fireTableDataChanged();
  Driver d;
  try{
    d = (Driver)Class.forName("org.postgresql.Driver").newInstance();
  }
  catch (Exception e) {
    System.out.println("Error 1");
    System.out.println(e.getStackTrace());
  }
  try{
    con = DriverManager.getConnection
    ("jdbc:postgresql://localhost:5432/"+DBNAME,USERNAME,PASSWORD);
    //    statement =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

  statement = con.createStatement();
  SqlReload(query);
  }
  catch(SQLException e)
  {
    System.out.println(e.getMessage());
  }
    }
//---------------------------------------------------------------------------------------------
    public boolean isCellEditable(int row, int column)
    {
  try
  {
    return metaData.isWritable(column+1);
  }
  catch (SQLException e)
  {
    return false;
  }
     // return true;
    }
//--------------------------------------------------------------------------------------------
    public void setValueAt(Object value, int row, int column)
    {
   try
  {
   String columnName = getColumnName(column);
                  //  System.out.println(columnName);
                  //  System.out.println(dbRepresentation(column, value));
   String query =
    "UPDATE "+tableName+
    " SET "+columnName+" = "+
    dbRepresentation(column, value)+
    " WHERE ";
  
  for(int col = 0; col < getColumnCount();col++)
  {
    String colName = getColumnName(col);
    
 
    if (colName==columnName)
     {
    continue;
     }
                    if (col != 0)
                     {
                    query = query + " and ";
                      }
                    query = query + colName +" = "+
                 dbRepresentation(col, getValueAt(row, col));
     }
//  System.out.println(query);
  PreparedStatement pstmt =
     con.prepareStatement(query);
  pstmt.executeUpdate();
  //System.out.println(pstmt.executeUpdate());
  Object val;
  val = tbRepresentation(column,value);
  Vector dataRow = (Vector)rows.elementAt(row);
  dataRow.setElementAt(val, column);
  fireTableDataChanged();
  
//  fireTableCellUpdated(row,column);
  }
  catch (Exception ex)
  {
     System.err.println(ex);
  }
    }
    

//-------------------------------------------------------------------------------------------    
    public Object dbRepresentation(int column, Object value) throws NumberFormatException
    {
  Object val;
  int type;
     if (value == null)
  {
     return "null";
  }
     try
  {  //   System.out.println("column+1");    System.out.println("type");
      
     type = metaData.getColumnType(column+1);
  //   System.out.println("type");
  //   System.out.println(type);
  }
     catch (SQLException e)
  {
    return value.toString();
  }
     
     
     switch(type)
  {
    case Types.BIGINT:
    return val = new Long(value.toString().trim());
    case Types.CHAR:
    // System.out.println("CHAR");
     return val = "'"+new String(value.toString().trim())+"'";
    case Types.TINYINT:
    case Types.SMALLINT:
    case Types.INTEGER:
//     System.out.println("INTEGER");
    return val = new Integer(value.toString().trim());
    
    case Types.REAL:
    case Types.FLOAT:
    case Types.DOUBLE:
    case Types.NUMERIC:
//     System.out.println("NUMERIC");
    return val = new Double(value.toString().trim());
    
    default: return val = "'"+new String(value.toString().trim())+"'";
  }
  }
    //---------------------------------------------------------------------------------------
    public Object tbRepresentation(int column, Object value)   throws NumberFormatException
    {
          Object val;
        int type;
        if (value == null)
         {   return "null";   }
      try
       { type = metaData.getColumnType(column+1); }
      catch (SQLException e) {   return value.toString().trim(); }

      switch(type)
       {
         case Types.BIGINT:
               return val = new Long(value.toString().trim());
         case Types.TINYINT:
         case Types.SMALLINT:
         case Types.INTEGER:
              return val = new Integer(value.toString().trim());
         case Types.REAL:
         case Types.FLOAT:
         case Types.DOUBLE:
         case Types.NUMERIC:  
               return val = new Double(value.toString().trim());
         default: return val = new String(value.toString());
               
        }
    }
    //---------------------------------------------------------------------------------------

    public void SqlReload(String query)
    {
     try{
      fireTableDataChanged();
    resultSet = statement.executeQuery(query);
    metaData = resultSet.getMetaData();
    int numberOfColumns =  metaData.getColumnCount();
    columnNames = new String[numberOfColumns];
    for(int column = 1; column <= numberOfColumns; column++)
    {
     columnNames[column-1] =
     metaData.getColumnName(column);
    }
    rows = new Vector();
    while (resultSet.next())
    {
       Vector newRow = new Vector();
     for (int i = 1; i <=  getColumnCount(); i++)
     {
       newRow.addElement(resultSet.getObject(i));
     }
     
     rows.addElement(newRow);
    }
     }
     catch(SQLException e)
  {
    System.out.println(e.getMessage());
  }
    }
//----------------------------------------------------------------------------------------
    public void SqlInsert(String query,String query1)
    {
    try{
    PreparedStatement pstmt =
        con.prepareStatement(query);
     pstmt.executeUpdate();
                   SqlReload(query1);
    }
  catch(SQLException e)
  {
    System.out.println(e.getMessage());
  }
    }
//******************************************************************************************    
    public void Sql(String query1)
    {
    try{
    PreparedStatement pstmt =
        con.prepareStatement(query1);
     pstmt.executeUpdate();
//                  SqlReload(query1);
    }
  catch(SQLException e)
  {
    System.out.println(e.getMessage());
  }
    }
  //---------------------------------------------------------------------------------------
    public void SqlDelete(String query,String query1,int cur_row)
    {
    try{   
    String query_=query;
    query_= query_ + tbRepresentation(0, getValueAt(cur_row, 0));
    fireTableDataChanged();
    PreparedStatement pstmt = con.prepareStatement(query_);
    
      System.out.println(query_);
    
       pstmt.executeUpdate();
    //   System.out.println(pstmt.execute());
    //    PreparedStatement pstmt =
    //    con.prepareStatement(query_);
    //    pstmt.setDouble(1,cur_row);
    //    query_= query_ + dbRepresentation(0, getValueAt(cur_row, 0));
//       System.out.println(pstmt.executeUpdate()); 
             //   System.out.println(query_);
       
                SqlReload(query1);
    }
  catch(SQLException e)
  {
    System.out.println(e.getMessage());
  }
    }
  //---------------------------------------------------------------------------------------    
    
  public void fireTableRowsDeleted(int firstRow, int lastRow) {
//   System.out.println("fireTableRowsDeleted");
    //  rows.remove(firstRow);
    }
  public void fireTableRowsInserted(int firstRow, int lastRow) {
  // Vector newRow = new Vector();
  //    for (int i = 1; i <=  getColumnCount(); i++)
  //    {
  //   newRow.addElement(resultSet.getObject(i));
  //    }
    //    rows.addElement(newRow);
//   System.out.println("fireTableRowsInserted");
    }    
    
    
//------------------------------------------------------
}


и модели
Цитата

public class TableMap extends AbstractTableModel implements TableModelListener
{
    protected TableModel model; 

    public TableModel  getModel() {
        return model;
    }

    public void  setModel(TableModel model) {
        this.model = model; 
        model.addTableModelListener(this); 
    }

    // By default, Implement TableModel by forwarding all messages 
    // to the model. 

    public Object getValueAt(int aRow, int aColumn) {
        return model.getValueAt(aRow, aColumn); 
    }
        
    public void setValueAt(Object aValue, int aRow, int aColumn) {
        model.setValueAt(aValue, aRow, aColumn); 
    }

    public int getRowCount() {
        return (model == null) ? 0 : model.getRowCount(); 
    }

    public int getColumnCount() {
        return (model == null) ? 0 : model.getColumnCount(); 
    }
        
    public String getColumnName(int aColumn) {
        return model.getColumnName(aColumn); 
    }

    public Class getColumnClass(int aColumn) {
        return model.getColumnClass(aColumn); 
    }
        
    public boolean isCellEditable(int row, int column) { 
         return model.isCellEditable(row, column); 
    }
//
// Implementation of the TableModelListener interface, 
//

    // By default forward all events to all the listeners. 
    public void tableChanged(TableModelEvent e) {
        fireTableChanged(e);
    }
}



Добавлено через 11 минут и 48 секунд
Нашел причину. Чем больше устанавливаешь  размер таблицы:
jTable.setPreferredSize(new Dimension(453,419)),
тем больше показываеться. 
Знаю вывод был на лицо.
Каждый раз увеличивать параметр не охота и надоест. есть ли метод автоматического определения длины  исходной таблицы.


--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
AntonSaburov
Дата 3.3.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



SELECT COUNT(*) FROM TABLE - наверно лучше вряд ли придумать можно
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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