我一直在尝试找到一种通过直接输入来更新单元格的方法。根据我的研究,每个人似乎都说你必须使用
myJTable.fireTableCellUpdated()
尽管如此,它一直要求我转换 myJTable --> 它不能转换为 AbstractTableModel,据我所知,这是需要的。
这是我当前的表代码(如果有帮助的话):
myJTable= new JTable();
myJTable.setModel(new DefaultTableModel(
new Object[][] {
{null, null, null},
},
new String[] {
"Thing#1", "Thing#2", "Thing#3"
}
));
myJTable.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
myJTable.fireTableCellUpdated(e.getFirstRow(), e.getColumn());
myJTable.repaint(tblCG.getCellRect(e.getFirstRow(), e.getColumn(), false));
myJTable.putClientProperty("terminatedEditOnFocusLost", true);
}
});
我如何保存通过用户直接输入更新的单元格中的数据? 谢谢!
最佳答案
根据您想要执行的操作,您可以使用...
-
JTable#setValueAt(Object, int, int)
或TableModel#setValueAt(Object, int, int)
修改现有单元格的行/列值。请注意,根据当前排序顺序和列位置,模型和 View 可能具有不同的索引。 - 您可以使用
DefaultTableModel#addRow
添加新行并且 - 您可以使用
DefaultTableModel#removeRow
删除它们。请记住,索引值必须位于模型上下文中,如果您从表/ View 中获取原始值,则必须首先将其转换为模型上下文...
例如...
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class Test {
public static void main(String[] args) {
new Test();
}
private JTable myJTable;
private String values[] = {"Orange", "Green", "Blue", "Pink", "Yellow"};
private int count;
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
myJTable = new JTable();
myJTable.setModel(new DefaultTableModel(
new Object[][]{{"Banana", "Yellow"}},
new Object[]{"Fruit", "Color"}
));
JButton change = new JButton("Change");
change.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
count++;
String value = values[Math.abs(count % values.length)];
myJTable.setValueAt(value, 0, 1);
}
});
JButton add = new JButton("add");
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultTableModel model = (DefaultTableModel) myJTable.getModel();
model.addRow(new Object[]{"Apple " + model.getRowCount(), "Green"});
}
});
JButton delete = new JButton("delete");
delete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int rowIndex = myJTable.getSelectedRow();
rowIndex = myJTable.convertRowIndexToModel(rowIndex);
if (rowIndex > 0) {
DefaultTableModel model = (DefaultTableModel) myJTable.getModel();
model.removeRow(rowIndex);
}
}
});
JPanel actions = new JPanel();
actions.add(change);
actions.add(add);
actions.add(delete);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(myJTable));
frame.add(actions, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
如果您自己以某种方式自定义了该类,则您应该只需要调用帮助器 fireXxx
事件方法之一,并且只能从类上下文中调用,不应从外部触发它们,这是实现类的责任来做到这一点
所以,没有额外的代码......
默认情况下内置单元格编辑...
看...
了解更多详情...
关于java - 无法从 JTable 更新单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27052514/