0

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

4

4 回答 4

1

TableCellEditor的不正确。假设您的Table模型存储 的实例Date,调用setDefaultEditor()如 所示DemoTableModel,在类中找到并在此处com.toedter.calendar.demo.DemoTable说明。

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

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

于 2013-08-06T23:02:26.507 回答
1

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

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

谢谢大家的帮助。

于 2013-08-07T11:43:25.547 回答
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 在编辑时退出窗口表格(边距在表格之外),那么一切正常 - 无需解决方法 - 刷新是 Swing 错误仅当您必须照顾您外面的其他窗口时才完成(可能会调用自动刷新所有内容 - 这就是尚未发现此错误的原因)

于 2016-03-12T20:32:56.280 回答
0
******
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()));
                }
            };
}
于 2021-12-02T00:49:07.417 回答