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

Posted

技术标签:

【中文标题】JTable 单元格中的 JDateChooser 输入键并不总是有效【英文标题】:JDateChooser inside JTable cell enter key does not always work 【发布时间】:2013-08-07 15:26:47 【问题描述】:

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

【问题讨论】:

实现无效 - cellEditor必须在编辑终止时通知其监听器 【参考方案1】:

您的TableCellEditor 不正确。假设您的Table 模型存储了Date 的实例,请调用setDefaultEditor(),如DemoTableModel 所示,它位于com.toedter.calendar.demo.DemoTable 类中,并说明了here。

table.setDefaultEditor(Date.class, new JDateChooserCellEditor());

附录:不要在单元格编辑器中设置日期格式;在JDateChooser 构造函数中指定它或使用setDateFormatString()

【讨论】:

感谢您的宝贵时间,不幸的是它似乎没有任何改变,除非我使用默认的 JDateChooserCellEditor 它具有 yyyy-MM-dd 日期格式,我不应该在我的国家/地区的程序中使用它。真令人沮丧,回车键有时有效,有时无效...... 奇怪的是,在从 DataChooser 中输入/选择日期并按 TAB 按钮或任何箭头键一切正常后,日期被保存到其单元格中。处理回车键一定有问题【参考方案2】:

嗯,我找到了解决问题的方法。我认为这不是最好的方法,但它有效,我已经浪费了太多时间试图解决这个问题。向 jDateChooser 组件添加侦听器并通知用户 kleopatra 所述停止编辑属性更改似乎可以解决问题。

    dateChooser.addPropertyChangeListener(new PropertyChangeListener() 
                @Override
                public void propertyChange(PropertyChangeEvent evt) 
                    if (evt.getPropertyName().equals("date")) 
                        stopCellEditing();
                    
                
            );

谢谢大家的帮助。

【讨论】:

这就是要走的路,确切地说:-) 请注意:编辑开始时可能需要不触发,在这种情况下,日期很可能也会更改(不知道JDataChooser 的内部结构,但我们的 SwingX 的 DatePickerCellEditor 需要受到保护)【参考方案3】:

    你的答案的变体对我有用

    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 在编辑时退出窗口表格(边距在表格之外),那么一切正常 - 无需解决方法 - 这是一个仅当您必须处理您外部的其他窗口时才完成刷新的摆动错误(可能会调用自动刷新所有 - 这就是尚未发现此错误的原因)

【讨论】:

【参考方案4】:
******
yourtable.getColumnModel().getColumn(7).setCellEditor(getDateChooserCellEditor());
or
yourtable.setDefaultEditor(java.util.Date.class, getDateChooserCellEditor());
******

public JDateChooserCellEditor getDateChooserCellEditor() 
    JDateChooserCellEditor cellEditor = new JDateChooserCellEditor()
        @Override
        public Component getTableCellEditorComponent(JTable jtable, Object o, boolean bln, int i, int i1) 
            java.awt.event.ActionListener l = getStopCellEditorActionListener(jtable);
            Component component = super.getTableCellEditorComponent(jtable, o, bln, i, i1);
            JDateChooser dateChooser = (JDateChooser) component;
            JTextField dateEditor = (JTextField) dateChooser.getDateEditor().getUiComponent();
            try 
                dateEditor.removeActionListener(l);
                dateEditor.addActionListener(l);
             catch (Exception e) 
                JOptionPane.showMessageDialog(null, e.getMessage());
            
            
            return component;
        
    ;
    return cellEditor;

private java.awt.event.ActionListener getStopCellEditorActionListener(JTable table) 
    return new java.awt.event.ActionListener() 
                public void actionPerformed(java.awt.event.ActionEvent evt) 
                    table.editingStopped(new ChangeEvent(table.getCellEditor()));
                
            ;

【讨论】:

以上是关于JTable 单元格中的 JDateChooser 输入键并不总是有效的主要内容,如果未能解决你的问题,请参考以下文章

如何使 JTable 单元格不可编辑但应该能够选择和复制当前单元格中的值

在jTable(自动保存)中编辑后如何保存单元格中的数据?

JTable排序不是单元格中的好值

如何在编辑时选择JTable单元格中的所有文本

JTable-在单元格中绘制内容(文本)

在jTable(自动保存)中编辑后,如何将单元格中的数据保存在sql中?