2014-08-27 3 views
0

Вот мой код:я не могу просматривать данные в JTable Из модели таблицы

Object[][] refreshCartonCodesToTable = dbutils.checker.CartonCodesToTable(); 
String[] colnames = new String[6]; 
colnames[0] = selectCodes.invoiceTable.getColumnName(0).toString(); 
colnames[1] = selectCodes.invoiceTable.getColumnName(1).toString(); 
colnames[2] = selectCodes.invoiceTable.getColumnName(2).toString(); 
colnames[3] = selectCodes.invoiceTable.getColumnName(3).toString(); 
colnames[4] = selectCodes.invoiceTable.getColumnName(4).toString(); 
colnames[5] = selectCodes.invoiceTable.getColumnName(5).toString(); 

MyTableModel mod = new MyTableModel(refreshCartonCodesToTable, colnames); 
selectCodes.invoiceTable = new JTable(mod); 
selectCodes.invoiceTable.setVisible(true); 

Пользовательские модели, как показано ниже:

class MyTableModel extends DefaultTableModel { 

    public MyTableModel(Object data[][], Object columnames[]) { 
     super(data, columnames); 
    } 

    public Class getColumnClass(int col) { 
     if (col == 5) { 
      return Boolean.class; 
     } else { 
      return String.class; 
     } 
    } 

    @Override 
    public boolean isCellEditable(int row, int col) { 
     if (col == 0) //first column will be uneditable 
     { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 

В таблице отображается columnames, но данные не отображаемая , В массиве имеются данные, а выход проб - как показано ниже:

250VV 250VV0575W20140819 false B1 19 August 2014 
250VV 250VV0561W20140819 false B1 19 August 2014 
250VV 250VV0560W20140819 false B1 19 August 2014 
250VV 250VV0559W20140819 false B1 19 August 2014 
250VV 250VV0558W20140819 false B1 19 August 2014 

Имеется шесть столбцов. Шестой столбец я хочу поместить флажок в ячейки.

Может кто-нибудь мне помочь.

Это исходный код для CartonCodesToTable();

public static Object[][] CartonCodesToTable() { 
     Object[][] array = null; 
     try { 
      dbutils.checker.connect_to_db_again_again(); 

      sqlcommand = "SELECT Product_ID, carton_code, scanned, batchno,date FROM carton_codes where scanned ='false' order by bno asc"; 
      rset = stmts.executeQuery(sqlcommand); 
      int row = 0; 
      while (rset.next()) { 
       rset.last(); 
       row = rset.getRow(); 
      } 

      array = new String[row][6]; 
      rset.beforeFirst(); 

      int x = 0; 
      while (rset.next()) { 
       array[x][0] = rset.getObject("Product_ID"); 
       array[x][1] = rset.getObject("carton_code"); 
       array[x][2] = rset.getObject("scanned"); 
       array[x][3] = rset.getObject("batchno"); 
       array[x][4] = rset.getObject("date"); 
       array[x][5] = false; 
       x += 1; 
      } 
      conn.close(); 

     } catch (SQLException e) { 
      e.printStackTrace(); 
      JOptionPane.showMessageDialog(null, e); 
     } 
     return array; 
    } 

Когда я использую массив [x] [5] = false; Я получаю сообщение об ошибке 'java.lang.ArrayStoreException: java.lang.Boolean' Поэтому я решил использовать массив [x] [5] = "false";

+0

Почему вы хотите вернуть класс java? – reporter

+0

Я хочу, чтобы последний столбец возвращал булевский класс, чтобы вместо него отображался флажок true/false – benzinect

+0

В моих глазах это странный код, и я думаю, что тип данных несовместим с типом данных, что компонент -to создайте флажок. Я просто рекомендую сделать его простым, как nessacary, и написать «true» или «false» или попытаться преобразовать его в primitiv boolean. – reporter

ответ

0

Вы не предоставили MCVE, как я и предложил, поэтому сложно сказать, что происходит. Первое, что я вижу, хотя это плохое использование ResultSet, вам не нужно делать все это. Например, использование вами rs.last().

boolean last() throws SQLException - перемещает курсор к последней строке в этом ResultSet объекта.

О ResultSet from API

по умолчанию ResultSet объект не является обновляемым и имеет курсор, который движется только вперед. Таким образом, вы можете проходить через него только один раз и только от первой строки до последней строки. можно производить объекты ResultSet, которые прокручиваются и/или обновляемым (см API для примера, как это сделать)

Так если вы не сделать ResultSet прокручивать, что объяснило бы вы получаете нет результатов, так как вы переместили курсор в конец с вызовом на rs.last()

Это, как говорится, вам не нужно получать количество строк. Используйте динамическую структуру данных для создания модели. Просто используйте Vector. Если вы используете массив для данных, DefaultTableModel преобразует его в Vector (под капотом) в любом случае.

Обычный подход заключается в том, чтобы использовать класс ResultSetMetaData и получить счетчик столбцов и создать динамическое значение Vector<Vector<Object>> и построить таким образом DefaultTableModel. Что-то вроде:

public DefaultTableModel getModelFromResultSet(ResultSet rs) throws Exception { 

    ResultSetMetaData md = rs.getMetaData(); 
    int columnCount = md.getColumnCount(); 

    String[] cols = new String[columnCount]; 
    for (int i = 1; i <= columnCount; i++) { 
     col[i - 1] = md.getColumnName(i); 
    } 

    Vector<Vector<Object>> dataVector = new Vector<Vector<Object>>(); 
    while(rs.next()) { 
     Vector<Object> row = Vector<Object>(); 
     for (int i = 1; i <= columnCount; i++) { 
      row.add(rs.getObject(i)); 
     } 
     dataVector.add(row); 
    } 

    DefaultTableModel model = new DefaultTableModel(dataVector, cols) { 
     @Override 
     public Class<?> getColumnClass(int column) { 
      ... 
     } 
    }; 
    return model; 
} 

Или что-то в этом роде. Не тестировали его (для каких-либо ошибок), но основная концепция есть.

Насколько ваш ArrayStoreException, обратите внимание на то, что вы делаете

Object[][] array = null; 
... 
array = new String[row][6]; 

Какой смысл делать это. Вы делаете это, каждый объект должен быть String. Что может быть нежелательно для рендеринга.

Смежные вопросы