Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Swing & DB. Database Table Model
Список форумов
 ->  Примеры


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Староверъ : 7629
Ктапубеп
Откуда: Elfland

СообщениеАвг 29, 2008 14:06 
Ответить с цитатой
Пример использования JTable для отображения данных из БД.
Код:
/**
 * This model work with any database table. You should only set an object of java.sql.ResultSet into it.
 * This table cannot insert data into database.
 */

import java.util.*;
import java.sql.*;
import java.awt.*;
import javax.swing.table.*;
import javax.swing.*;

public class DatabaseTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 1L;
    private ArrayList<String> columnNames = new ArrayList<String>();
    private ArrayList<Class> columnTypes = new ArrayList<Class>();
    private ArrayList<ArrayList<Object>> data = new ArrayList<ArrayList<Object>>();

    public int getRowCount() {
        synchronized (data) {
            return data.size();
        }
    }

    public int getColumnCount() {
        return columnNames.size();
    }

    public Object getValueAt(int row, int col) {
        synchronized (data) {
            return data.get(row).get(col);
        }
    }

    public String getColumnName(int col) {
        return columnNames.get(col);
    }

    public Class getColumnClass(int col) {
        return columnTypes.get(col);
    }

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

    public void setValueAt(Object obj, int row, int col) {
        synchronized (data) {
            data.get(row).set(col, obj);
        }
    }

    /**
     * Core of the model. Initializes column names, types, data from ResultSet.
     *
     * @param rs ResultSet from which all information for model is token.
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public void setDataSource(ResultSet rs) throws SQLException, ClassNotFoundException {
        ResultSetMetaData rsmd = rs.getMetaData();
        columnNames.clear();
        columnTypes.clear();
        data.clear();

        int columnCount = rsmd.getColumnCount();
        for (int i = 0; i < columnCount; i++) {
            columnNames.add(rsmd.getColumnName(i + 1));
            Class type = Class.forName(rsmd.getColumnClassName(i + 1));
            columnTypes.add(type);
        }
        fireTableStructureChanged();
        while (rs.next()) {
            ArrayList rowData = new ArrayList();
            for (int i = 0; i < columnCount; i++) {
                if (columnTypes.get(i) == String.class)
                    rowData.add(rs.getString(i + 1));
                else
                    rowData.add(rs.getObject(i + 1));
            }
            synchronized (data) {
                data.add(rowData);
                this.fireTableRowsInserted(data.size() - 1, data.size() - 1);
            }
        }
    }

    //***TEST***
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "database_url";                //your data
            String user = "user_name";                  //your data
            String password = "password";               //your data
            String query = "select * from table_name";  //your data
            Connection con = DriverManager.getConnection("jdbc:mysql://" + url, user, password);
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(query);
            DatabaseTableModel model = new DatabaseTableModel();
            model.setDataSource(rs);
            JTable table = new JTable(model);

            JPanel panel = new JPanel(new BorderLayout());
            panel.add(new JScrollPane(table), BorderLayout.CENTER);

            JFrame frame = new JFrame("Database Table Model");
            frame.setLocationRelativeTo(null);
            frame.setSize(500, 400);
            frame.setContentPane(panel);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Источник:
И. Портянкин "Swing. Эффективные пользовательские интерфейсы".


Последний раз редактировалось: Староверъ (Ноя 01, 2009 13:26), всего редактировалось 2 раз(а)
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
Vlad : 1670
JavaTalks Team Member
Откуда: ODS-KRK-LON-HFE

СообщениеМай 14, 2009 14:02 
Ответить с цитатой
В примере есть один очень нехороший баг: незакрытый источник данных, который не используется после полного копирования из него данных.

П.С. Неплохо было бы добавить пример для обновляемого ResultSet с подгрузкой данных on-demand.
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Примеры


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru