java - 在单元格触发打开对话框时更新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");" 上方的行 当我关闭对话框时,这会写入单元格,但不会写入我写入表模型的值。
将对话框设置为非模态不会改变这一点。唯一的优点是在对话框仍然打开时其他单元格会得到更新,而不是单击的单元格。最好的情况是我可以将所有单元格更新为非模态以实时查看更改。
希望我很好地解释了我的问题,并且所有需要的信息都在那里。
如果您有任何想法,请告诉我,因为经过几个小时尝试不同的事情并在网上搜索,我还无法解决这个问题。
非常感谢!
托比
解决方案
另一个单元格得到更新,但我点击的单元格没有
这是因为当编辑器停止时,编辑器会更新 TableModel。所以它会覆盖对话框中的代码。
一般来说,编辑器应该只更新一个单元格。
如果此值导致其他单元格发生更改,那么您应该:
- 覆盖
setValueAt(...)
TableModel 的方法以更新另一个单元格中的另一个值 - 使用 TableModelListener 来通知值的变化。查看:https ://stackoverflow.com/a/3541876/131872 ,了解此方法的工作示例。
推荐阅读
- rxjs - 如何通过 catchError() 正确传播错误?
- android - 使用 Proguard 时 Firebase 身份验证不起作用
- java - 自定义类上的 readEntity 抛出 MessageBodyProviderNotFoundException
- asp.net-mvc - 以编程方式获取一堆视图的模型类型
- php - 配置用户和角色时 Symfony php 错误
- java - 未发送 SIP/HTTP 融合应用程序邀请
- java - Java wsimport 错误
- php - 可以得到一个由字符串标签定义的随机数吗?喜欢{1-100}
- mysql - 在 Select 语句期间引用一个字段声明的名称
- android - 如何创建一个上面有一些空间(间隙)的布局。不在布局中