JTable单元格内的JDateChooser输入键并不总是有效

时间:2013-08-06 14:41:40

标签: java swing jtable tablecelleditor jcalendar

我正在使用稍微修改过的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中。经过另一次尝试它不起作用..下一次尝试 - 它的工作原理。这太令人困惑了。谢谢大家的帮助。

3 个答案:

答案 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)

  1. 您的答案的变体对我有用

    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){};
             }
         }
    });     
    
  2. 超级副作用 - 如果你用你的鼠标缩小你的桌子,并且JDateChooser在编辑时退出窗口表(边缘在桌子外面),那么一切都很完美 - 没有必要的解决方法 - 它是一个摇摆错误,只有当你需要处理你以外的其他窗口时才进行刷新(可能是一个自动刷新全部被调用 - 这就是为什么还没有发现这个错误)