我在这个网站上已经阅读了很多关于这个问题的问题,我找不到为什么它仍然没有用。
问题:
我在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()
方法很好,所以问题是什么?它可能是我的“数据”,我存储表的数据。这是数据数组:
答案 0 :(得分:3)
有很多事情会跳出来......
getValueAt
似乎被宣布为错误。它应该返回Object
。想想它一秒钟。您的期望是第一列将是boolean
,那么如何从此方法返回String
...这导致...... data
数组是String
的数组...其中,期望第一个值应为boolean
。现在你可以实际保留这一点,但是你需要将值从boolean
方法转换为getValueAt
,然后再转回setValueAt
方法......这会导致... < / LI>
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停止运行,通常是相当不愉快的。
看看......
了解更多详情