复选框无法选择 - 它们是可编辑的! Java Swing

时间:2013-07-11 22:15:09

标签: java swing jtable

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

问题:

我在JTable内显示JScrollPaneJTable的构造如下:

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()方法很好,所以问题是什么?它可能是我的“数据”,我存储表的数据。这是数据数组:

1 个答案:

答案 0 :(得分:3)

有很多事情会跳出来......

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

enter image description here

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停止运行,通常是相当不愉快的。

看看......

了解更多详情