JTable Swing получить данные - PullRequest
1 голос
/ 07 марта 2012

Я пытаюсь заполнить таблицу данными из базы данных, однако у меня возникли некоторые проблемы с ней. Может ли кто-нибудь дать мне пример? (таким образом, таблица принимает параметр Object [] [] для данных). У меня есть следующий основной код для отображения таблицы;

class table extends JFrame
{
    JTable table; 

    public table()
    {
        setLayout(new FlowLayout());
        String[] columnNames = {"test","test","test"};
        Object[][] data= {{"test","test","test"},{"test","test","test"}};

        table = new JTable(data,columnNames);
        table.setPreferredScrollableViewportSize(new Dimension(500,100));
        table.setFillsViewportHeight(true);

       JScrollPane scrollPane = new JScrollPane(table);
       add(scrollPane); 
    }
}

1 Ответ

1 голос
/ 07 марта 2012

Два года назад, когда я учился в техническом училище, я написал небольшую библиотеку, помогающую решить некоторые проблемы, предложенные в упражнениях, в том числе DatabaseTableModel.

Класс расширяется от AbstractTableModel, , что означает, что вы можете установить его в качестве источника данных вашего JTable.

Вот алгоритм, который строит модель из ResultSet:

public final void constructModel(ResultSet rs) throws SQLException {
    ResultSetMetaData rsmd = rs.getMetaData();
    rs.last();
    rowCount = rs.getRow();
    int columnCount = rsmd.getColumnCount();
    // DatabaseColumn simply holds a name and a Class<?>.
    columns = new DatabaseColumn[columnCount];
    // This is the Object[][] array that you were talking about.
    // It holds all the data from the ResultSet.
    data = new Object[columnCount][rowCount];
    for (int i = 0; i < columnCount; ++i) {
        // Figure out the column name and type.
        int j = i + 1;
        String colName = rsmd.getColumnLabel(j);
        Class<?> colClass = String.class;
        try {
            colClass = Class.forName(rsmd.getColumnClassName(j));
        } catch (ClassNotFoundException ex) {
            colClass = String.class;
        }
        columns[i] = new DatabaseColumn(colName, colClass);
        // Get the data in the current column as an Object.
        rs.beforeFirst();
        for (int k = 0; rs.next(); ++k) {
            data[i][k] = rs.getObject(j);
        }
    }
    // Notify listeners about the changes so they can update themselves.
    fireTableStructureChanged();
}

Класс работал, когда я использовал его в школе, но это не совсем рабочий код. Когда я смотрю на это сегодня, я начинаю видеть проблемы.

Одной из проблем является то, что он загружает все содержимое ResultSet в память. Может довольно быстро стать уродливым.

Кроме того, алгоритм не совсем оптимален. Он зацикливается на курсоре базы данных, как если бы он был ничем; Я предполагаю , что для базы данных было бы дешевле, если бы она сначала извлекла все объекты в текущей строке и присвоила их соответствующим столбцам , а затем перешла к следующей строке.

Тем не менее, я думаю, что это достаточно хорошая отправная точка.

...