有很多东西会跳出来...
- (正如已经开始指出的那样)
getValueAt
似乎被宣布为错误的。它应该返回Object
。想一想。您的期望是第一列将是boolean
,那么您如何String
从该方法返回...导致...
- 您
data
的数组是String
...的数组,同样,期望第一个值应该是boolean
。现在您实际上可以保留它,但是您需要将值boolean
从getValueAt
方法转换为方法,然后再转换回setValueAt
方法......这导致......
- 您尚未实现
setValueAt
,因此无法存储对单元格值的更改
- 您也没有实施
getRowCount
, 这是必需的getColumnCount
, 这是必需的并且您应该实施getColumnName
, 因为您实际上有一些。
![在此处输入图像描述](https://i.stack.imgur.com/sSIXL.png)
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 会停止运行,这通常是相当不愉快的。
看一眼...
更多细节