无法从JTable更新单元格 [英] Can't update cells from JTable
问题描述
我一直在尝试寻找一种通过直接输入来更新单元格的方法.从我的研究中,每个人似乎都说您必须使用
myJTable.fireTableCellUpdated()
尽管如此,它一直要求我转换myJTable->不能将其转换为AbstractTableModel,据我所知,这是必需的.
如果可以的话,这是我当前的表格代码:
myJTable = new JTable();myJTable.setModel(新的DefaultTableModel(新对象[] [] {{null,null,null},},新的String [] {事物1",事物2",事物3"}));myJTable.getModel().addTableModelListener(new TableModelListener(){公共无效tableChanged(TableModelEvent e){myJTable.fireTableCellUpdated(e.getFirstRow(),e.getColumn());myJTable.repaint(tblCG.getCellRect(e.getFirstRow(),e.getColumn(),false));myJTable.putClientProperty("terminatedEditOnFocusLost",true);}});
我怎么可能保存通过用户直接输入已更新的单元格中的数据?谢谢!
根据您要执行的操作,可以使用...
了解更多详情...
I've been trying to find a way to update my cells by direct input. From my reshearch, everyone seems to say that you have to use
myJTable.fireTableCellUpdated()
Althought, it keeps asking me to cast myJTable --> It can't be casted to an AbstractTableModel which is what, from what I understood, is needed.
Here is my current code for the Table if that can helps :
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);
}
});
How is it possible for me to save the datas from the cell that has been updated by direct input from the user? Thanks !
Depending on what you are trying to do, you can use...
JTable#setValueAt(Object, int, int)
orTableModel#setValueAt(Object, int, int)
to modify the row/column values of existing cells. Just beware, that the model and view might have different indices based on the current sort order and column positions.- You can use
DefaultTableModel#addRow
to add new rows and - You can use
DefaultTableModel#removeRow
to remove them. Just remember, the index value MUST be within the models context, if you are taking the original value from the table/view, it must be converted first to the model's context...
For example...
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);
}
});
}
}
You should only need to call one of the helper fireXxx
event methods if you have customised the class yourself in some way and should ONLY be called from within the classes context, they should not be triggered externally, it's the responsibility of the implementing class to do this
So, with no additional code...
Cell editing is built in by default...
See...
for more details...
这篇关于无法从JTable更新单元格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!