首页 > 解决方案 > 在单元格触发打开对话框时更新java表模型

问题描述

我有一个 Java 程序,它有一个表和一个表模型。每个单元格都是一个带有鼠标侦听器的 JTextField。

public class ButtonCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener, MouseListener{  

private JTextField lab;

public ButtonCellEditor(MonthManager mm) {
    super();
    lab=new JTextField();
    lab.addMouseListener(this);     
}

当我单击单元格时,它会打开另一个 JDialog 来编辑单元格背景信息,该信息计算不同值的总和

@Override
public void mouseClicked(MouseEvent arg0) {
    CellDialog bd = new CellDialog(mm,mm.getMonths().get(column));  
    bd.openDialog();
    //lab.setText("34");                
}

在这个对话框中,我有一些组件来计算数据。一个是应用按钮,它应该更新被点击的单元格信息(有时还有其他单元格)

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() instanceof JButton){
        model.setValueAt(cellSum, i, columnIndex);  // <-- Cell where I clicked on
        model.setValueAt(anotherSum, i+1, columnIndex);  // <-- another cell
    }
}

现在发生的事情是另一个单元格得到更新,但我点击的单元格没有(关闭对话框后)。该代码只是显示基本内容的小片段。这里的整体代码太多了,而且只会让人恼火,因为我很确定它与单元格事件有关。不知何故,表格内容在获得焦点时或在处理 mouselistener 事件时无法更改。如果我启用他在 "lab.setText("34");" 上方的行 当我关闭对话框时,这会写入单元格,但不会写入我写入表模型的值。

将对话框设置为非模态不会改变这一点。唯一的优点是在对话框仍然打开时其他单元格会得到更新,而不是单击的单元格。最好的情况是我可以将所有单元格更新为非模态以实时查看更改。

希望我很好地解释了我的问题,并且所有需要的信息都在那里。

如果您有任何想法,请告诉我,因为经过几个小时尝试不同的事情并在网上搜索,我还无法解决这个问题。

非常感谢!

托比

标签: javaeventsdialog

解决方案


另一个单元格得到更新,但我点击的单元格没有

这是因为当编辑器停止时,编辑器会更新 TableModel。所以它会覆盖对话框中的代码。

一般来说,编辑器应该只更新一个单元格。

如果此值导致其他单元格发生更改,那么您应该:

  1. 覆盖setValueAt(...)TableModel 的方法以更新另一个单元格中的另一个值
  2. 使用 TableModelListener 来通知值的变化。查看:https ://stackoverflow.com/a/3541876/131872 ,了解此方法的工作示例。

推荐阅读