0

jTable セル内に jDateChooser を配置できるように、わずかに変更された JDateChooserCellEditor クラスを使用しています。クラスのコードは次のとおりです。

    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();
}

1 つのことがうまくいかず、解決策が見つかりません。内部に jDateChooser があるセルを初めてクリックすると、日付を選択して Enter キーを押しますが、何も起こりません。コンポーネントはフォーカスを維持しますが、データを確認しません。しかし、その後別のセルを選択すると、Enter キーが魔法のように機能し、日付が jTable に保存されます。別の試行の後、それは機能しません..次の試行-機能します。とても紛らわしいです。助けてくれてありがとう。

4

4 に答える 4

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 に答える