我正在使用稍微修改过的JDateChooserCellEditor类,它允许我将jDateChooser放在我的jTable单元格中。这是类的代码:
public class JDateChooserCellEditor extends AbstractCellEditor implements
TableCellEditor {
private JDateChooser dateChooser = new JDateChooser();
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
Date date = null;
if (value instanceof Date) {
date = (Date) value;
}
dateChooser.setDateFormatString("dd-MM-yyyy");
dateChooser.setDate(date);
return dateChooser;
}
public Object getCellEditorValue() {
dateChooser.setDateFormatString("dd-MM-yyyy");
return dateChooser.getDate();
}
有一件事不起作用,我找不到解决方案。当我第一次在内置jDateChooser的单元格上单击时,选择日期并按Enter键 - 没有任何反应。该组件保持其重点,但从未确认数据。但是,如果我之后选择不同的单元格,则输入键会神奇地起作用,并且日期会保存到我的jTable中。经过另一次尝试它不起作用..下一次尝试 - 它的工作原理。这太令人困惑了。谢谢大家的帮助。
答案 0 :(得分:1)
您的TableCellEditor
不正确。假设您的Table
模型存储了Date
的实例,请调用setDefaultEditor()
,如DemoTableModel
所示,该com.toedter.calendar.demo.DemoTable
位于课程table.setDefaultEditor(Date.class, new JDateChooserCellEditor());
中并显示{{3} }。
JDateChooser
附录:不要在单元格编辑器中设置日期格式;在setDateFormatString()
构造函数中指定它或使用{{1}}。
答案 1 :(得分:1)
好吧,我找到了解决问题的方法。我认为它不是最好的方式,但它有效,我已经失去了太多时间来解决这个问题。添加监听器到jDateChooser组件并通知停止编辑属性更改,因为用户kleopatra说明似乎解决了这个问题。
dateChooser.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("date")) {
stopCellEditing();
}
}
});
谢谢大家的帮助。
答案 2 :(得分:0)
您的答案的变体对我有用
private AbstractTableModel model;
.....
... in method getTableCellEditorComponent(JTable table, Object value, boolean isSelected, final int row, final int column) .....
try{
model = (AbstractTableModel) table.getModel();
} catch( Exception e){};
dateChooser.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
String pname = evt.getPropertyName();
if ( "date".equals( pname)) {
try{
model.fireTableCellUpdated( row, column);
} catch( Exception e){};
}
}
});
超级副作用 - 如果你用你的鼠标缩小你的桌子,并且JDateChooser在编辑时退出窗口表(边缘在桌子外面),那么一切都很完美 - 没有必要的解决方法 - 它是一个摇摆错误,只有当你需要处理你以外的其他窗口时才进行刷新(可能是一个自动刷新全部被调用 - 这就是为什么还没有发现这个错误)