2

我在这个网站上阅读了很多关于这个问题的问题,但我找不到它为什么仍然不起作用。

问题:

我做了一个JTable显示在一个JScrollPane. 构造JTable如下:

table = new JTable(new DataTableModel());   

如您所见,我使用了一个AbstractDataModel名为DataTableModel. 现在,当我显示此复选框时,会出现复选框,但无法选择它们。它们是可编辑的,如下所示。这是DataTableModel该类中的相关代码:(请注意,我的复选框列是第一列,位于索引 0 处,并且我在此列的数组中的数据为“null”)。对于一些

public class DataTableModel extends AbstractTableModel
{
    private String[][] data;
    private String[] header =
    { "", "KB Name", "fpGUID" };

    public DataTableModel() throws SQLException
    {
        // ========= CONNECTS TO DB AND PULLS RESULTS ==========

        // GETS RESULTS SET CALLED "rs"

        // populate data array
        int counter = 0;
        while (rs.next())
        {
            //data[counter][0] = "sfsdfsdfs ";
            data[counter][1] = (String) rs.getObject(2);
            data[counter][2] = (String) rs.getObject(4);

            counter++;
        }
        // =====================================================

    }

@Override
public String getValueAt(int rowIndex, int columnIndex)
{
    return data[rowIndex][columnIndex];
}

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

public Class getColumnClass(int column)
{
    if (column == 0)
    {
        return Boolean.class;
    } else
    {
        return String.class;
    }
}

所以,看来我的getColumnClass()方法很好,那么问题出在哪里?可能是我存储表格数据的“数据”。这是数据数组:

4

1 回答 1

4

有很多东西会跳出来...

  • (正如已经开始指出的那样)getValueAt似乎被宣布为错误的。它应该返回Object。想一想。您的期望是第一列将是boolean,那么您如何String从该方法返回...导致...
  • data的数组是String...的数组,同样,期望第一个值应该是boolean。现在您实际上可以保留它,但是您需要将值booleangetValueAt方法转换为方法,然后再转换回setValueAt方法......这导致......
  • 您尚未实现setValueAt,因此无法存储对单元格值的更改
  • 您也没有实施getRowCount, 这是必需的getColumnCount, 这是必需的并且您应该实施getColumnName, 因为您实际上有一些。

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.sql.SQLException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;

public class TestTableModel02 {

    public static void main(String[] args) {
        new TestTableModel02();
    }

    public TestTableModel02() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(new JTable(new DataTableModel())));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class DataTableModel extends AbstractTableModel {

        private Object[][] data;
        private String[] header = {"", "KB Name", "fpGUID"};

        public DataTableModel() {//throws SQLException {
            // ========= CONNECTS TO DB AND PULLS RESULTS ==========

            // GETS RESULTS SET CALLED "rs"

            // populate data array
//            int counter = 0;
//            while (rs.next()) {
//                //data[counter][0] = "sfsdfsdfs ";
//                data[counter][1] = (String) rs.getObject(2);
//                data[counter][2] = (String) rs.getObject(4);
//
//                counter++;
//            }
            // =====================================================

            data = new Object[4][3];
            data[0] = new Object[]{false, "Help", "1234"};
            data[1] = new Object[]{false, "On fire", "5648"};
            data[2] = new Object[]{false, "Drowning", "9012"};
            data[3] = new Object[]{false, "Micky Mouse", "3456"};
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return data[rowIndex][columnIndex];
        }

        @Override
        public boolean isCellEditable(int row, int col) {
            return col == 0;
        }

        @Override
        public Class getColumnClass(int column) {
            if (column == 0) {
                return Boolean.class;
            } else {
                return String.class;
            }
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            if (columnIndex == 0) {
                if (aValue instanceof Boolean) {
                    data[rowIndex][columnIndex] = (Boolean)aValue;
                    fireTableCellUpdated(rowIndex, columnIndex);
                }
            }
        }

        @Override
        public int getRowCount() {
            return data.length;
        }

        @Override
        public int getColumnCount() {
            return header.length;
        }

        @Override
        public String getColumnName(int column) {
            return header[column];
        }
    }
}

现在,有一些方法可以解决整个“第一列必须是布尔值”的问题,但坦率地说,这样做的代码要少得多。

我还强烈建议您查看SwingWorker并使用它进行所有数据加载,否则您可能会发现在开始加载数据时您的 UI 会停止运行,这通常是相当不愉快的。

看一眼...

更多细节

于 2013-07-12T05:10:48.520 回答