在我的应用程序中,我使用了一个类似于这个例子的java表格。我的问题是,当我更改单元格的值(甚至在上面的例子中),数据模型直到我点击不同的单元格之前都不会得到更新。即使我在更改单元格值后点击表格下面的灰色区域,模型也不会改变。我认为原因是单元格保持焦点,直到我点击另一个单元格。如何避免这种情况,并在不点击表格单元格的情况下更新模型。提前致谢。
我已经编辑了上面的示例代码以反映问题。
当您运行示例时,可以在表格下方的文本区域中查看表格内容。当您更新单元格后,它应该出现在下面的文本框中。但是,在您单击其他单元格之前,“setValueAt”方法不会被调用。
我已经编辑了上面的示例代码以反映问题。
public class JTableDemo extends JApplet {
private JTextArea txt = new JTextArea(4, 20);
// The TableModel controls all the data:
class DataModel extends AbstractTableModel {
Object[][] data = { { "one", "two", "three", "four" },
{ "five", "six", "seven", "eight" },
{ "nine", "ten", "eleven", "twelve" }, };
// Prints data when table changes:
class TML implements TableModelListener {
public void tableChanged(TableModelEvent e) {
txt.setText(""); // Clear it
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[0].length; j++)
txt.append(data[i][j] + " ");
txt.append("\n");
}
}
}
public DataModel() {
addTableModelListener(new TML());
fireTableDataChanged();
}
public int getColumnCount() {
return data[0].length;
}
public int getRowCount() {
return data.length;
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public void setValueAt(Object val, int row, int col) {
data[row][col] = val;
System.out.println(val);
// Indicate the change has happened:
fireTableDataChanged();
}
public boolean isCellEditable(int row, int col) {
return true;
}
}
public void init() {
Container cp = getContentPane();
JTable table = new JTable(new DataModel());
cp.add(new JScrollPane(table));
cp.add(BorderLayout.SOUTH, txt);
}
public static void main(String[] args) {
run(new JTableDemo(), 350, 200);
}
public static void run(JApplet applet, int width, int height) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
}
当您运行示例时,可以在表格下方的文本区域中查看表格内容。当您更新单元格后,它应该出现在下面的文本框中。但是,在您单击其他单元格之前,“setValueAt”方法不会被调用。