Хотите создать столбец в jTable, который является флажком, но при запуске он отображается как «класс java.lang.Boolean» - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь создать Jtable, который отображает запросы SQL. Я вставил столбец до отображения данных и установил его в логический класс. Когда я запускаю код вместо отображения флажков, вместо него отображается «класс java.lang.Boolean».

Я попытался вызвать методы isCellEditable () и getColumnClass ().

public static void FillTable(JTable table, String Query){
    try
    {   
        Connection conn = DriverManager.getConnection(databaseTest.main_conn,"root",databaseTest.db_usrPW);
        Statement stat = conn.createStatement();
        ResultSet rs = stat.executeQuery(Query);

      //Define new model
        DefaultTableModel tableModel = new DefaultTableModel();

        //Get MetaData from rs
        ResultSetMetaData metaData = rs.getMetaData();

        //Get number of columns from meta data
        int columnCount = (metaData.getColumnCount()+1);

        //Add Boolean column
        tableModel.addColumn(Boolean.class);
        tableModel.getColumnClass(0);

        //Get all column names from meta data and add columns to table model
        for (int columnIndex = 1; columnIndex < columnCount; columnIndex++){
            tableModel.addColumn(metaData.getColumnLabel(columnIndex));
        }

        //Create array of Objects with size of column count from meta data
        Object[] row = new Object[columnCount];

        //Scroll through result set
        while (rs.next()){
            row[0] = Boolean.class;
            tableModel.addRow(row);
            //Get object from column with specific index of result set to array of objects
            for (int i = 1; i < columnCount; i++){
                row[i] = rs.getObject(i);
                }            
            //Now add row to table model with that array of objects as an argument
            tableModel.addRow(row);
        }
        db_table.setModel(tableModel);
        rs.close();
    }catch(Exception e){
        e.printStackTrace();
    }   
}

1 Ответ

0 голосов
/ 07 мая 2019

Как JavaDocs для DefaultTableModel выделяет

Предупреждение: DefaultTableModel возвращает класс столбца Object ... Если вы используете DefaultTableModel ... вы сильно рекомендуется переопределить getColumnClass для возврата соответствующего типа.

Хотя комментарий относится к использованию TableRowSorter, он подчеркивает основную причину вашей проблемы. getColumnClass возвращает тип Object, что означает, что он не позволяет использовать рендеры по умолчанию для таких типов, как Boolean.

Вместо этого вам нужно будет создать собственную реализацию TableModel (я предпочитаю AbstractTableModel, но вы все равно можете использовать DefaultTableModel), переопределить getColumnClass и вернуть более подходящее значение для конкретного столбца, например ...

Picky

import java.awt.EventQueue;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Test extends JFrame {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                DefaultTableModel model = new DefaultTableModel() {
                    @Override
                    public Class<?> getColumnClass(int columnIndex) {
                        return Boolean.class;
                    }
                };
                model.addColumn("Pick");

                Random rnd = new Random();
                for (int index = 0; index < 10; index++) {
                    Object[] row = new Object[1];
                    row[0] = rnd.nextBoolean();
                    model.addRow(row);
                }
                JTable table = new JTable(model);

                JFrame frame = new JFrame();
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

Примечание Это простой пример, если у вас есть несколько столбцов, вам нужно будет решить, что возвращать для каждого столбца

...