有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用户界面希望在作为复选框的jTable中创建一列,但在运行时显示为“class java”。lang.Boolean'

我正在尝试创建一个接受SQL查询的Jtable。我在显示数据之前插入了一列,并将其设置为布尔类。当我运行代码而不是显示复选框时,它会显示“ClassJava”。而不是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) 个答案

  1. # 1 楼答案

    正如JavaDocs for ^{}所强调的

    Warning: DefaultTableModel returns a column class of Object... If you use DefaultTableModel ... you are strongly encouraged to override getColumnClass to return the appropriate type.

    虽然评论与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);
                }
            });
        }
    }
    

    注意这是一个简单的例子,如果你有多个列,你需要决定每个列返回什么