Как получить данные объекта DefaultTableModel в подкласс DefaultTableModel - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть jTable, отображающий данные таблицы SQL с двумя столбцами и позволяющий пользователю вести список.Это моя первая Java-программа.Сделайте так, чтобы пользователь мог редактировать список данных и нажать «Сохранить» для обновления.Я получаю данные sql в DefaultTableModel jTable из этой строки кода:

paCutAboveTable.SetTableModel((DefaultTableModel) DbUtils.resultSetToTableModel(rs));

Я предполагаю, что DBUtils и resultSets знакомы людям здесь.Я хочу добавить CheckBox для каждой строки.Глядя здесь и в других местах, я продолжал смотреть на подкласс DefaultTableModel, чтобы переопределить метод таким образом:

/*

  * JTable uses this method to determine the default renderer/
  * editor for each cell.  If we didn't implement this method,
  * then the last column would contain text ("true"/"false"),
  * rather than a check box.
  */

 public Class getColumnClass(int c) {

     return getValueAt(0, c).getClass();
   }

Однако я не могу понять, как получить выходные данные метода DefaultTableModel из resultSetToTableModel в мой подкласс - показанный операторне компилируется, если метод SetTableModel изменен для принятия подкласса в качестве параметра.Есть ли простой способ, по которому я скучаю?

1 Ответ

1 голос
/ 11 апреля 2019

Вот пример, который показывает, как прочитать данные из ResultSet и реализовать метод getColumnClass(...) в вашем собственном пользовательском DefaultTableModel:

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

public class TableFromDatabase extends JFrame
{
    public TableFromDatabase()
    {
        Vector<Object> columnNames = new Vector<Object>();
        Vector<Object> data = new Vector<Object>();

        try
        {
            //  Connect to an Access Database

            String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
//            String url = "jdbc:odbc:???";  // if using ODBC Data Source name
            String url =
                "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/directory/???.mdb";
            String userid = "";
            String password = "";

            Class.forName( driver );
            Connection connection = DriverManager.getConnection( url, userid, password );

            //  Read data from a table

            String sql = "Select * from ???";
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery( sql );
            ResultSetMetaData md = rs.getMetaData();
            int columns = md.getColumnCount();

            //  Get column names

            for (int i = 1; i <= columns; i++)
            {
                columnNames.addElement( md.getColumnLabel(i) );
            }

            //  Get row data

            while (rs.next())
            {
                Vector<Object> row = new Vector<Object>(columns);

                for (int i = 1; i <= columns; i++)
                {
                    row.addElement( rs.getObject(i) );
                }

                data.addElement( row );
            }

            rs.close();
            stmt.close();
            connection.close();
        }
        catch(Exception e)
        {
            System.out.println( e );
        }

        //  Create table with database data

        DefaultTableModel model = new DefaultTableModel(data, columnNames)
        {
            @Override
            public Class getColumnClass(int column)
            {
                for (int row = 0; row < getRowCount(); row++)
                {
                    Object o = getValueAt(row, column);

                    if (o != null)
                    {
                        return o.getClass();
                    }
                }

                return Object.class;
            }
        };

        JTable table = new JTable( model );
        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );

        JPanel buttonPanel = new JPanel();
        add( buttonPanel, BorderLayout.SOUTH );
    }

    public static void main(String[] args)
    {
        TableFromDatabase frame = new TableFromDatabase();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible(true);
    }
}

Переопределив метод getColumnClass(...), который вы теперь увидитеотформатированный по правому краю, и если вам когда-нибудь понадобится отсортировать данные, он будет работать должным образом, поскольку столбец будет отсортирован по числовому значению, а не по строковому значению.

Я хочу добавить CheckBox к каждомустрока.

Итак, теперь у вас есть две опции:

  1. Измените приведенный выше код так, чтобы вектор «columnNames» содержал другое имя заголовка для столбца флажка и добавилBoolean.FALSE к каждому вектору «строки» при итерации по ResultSet.

  2. Используйте вышеуказанную TableModel как есть (или используйте DbUtils TableModel), а затем создайте обертку TableModel, которая добавитстолбец флажка для любой существующей TableModel.Проверьте: Как добавить флажок в Jtable, заполненную с помощью rs2xml для примера такого подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...