Jcalender na Jtable, como proceder?

1 resposta
java
R

Pessoal, coloquei um calendário na célula da jtable, mas está tendo uma reação estranha e não estou conseguindo entender. vou postar o código e a imagem.

import com.toedter.calendar.JDateChooser;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.util.EventObject;
import java.util.Locale;
import javax.swing.AbstractCellEditor;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.table.TableCellEditor;

public class DateCellEditor extends AbstractCellEditor implements TableCellEditor {

    JDateChooser editor;
    int clickCountToStart = 2;

    public DateCellEditor() {
        editor = new JDateChooser();
//        editor.setLocale(Locale.ENGLISH);
        editor.setDateFormatString("dd/MM/yyyy");
        editor.setFocusable(true);

        JComponent editorComponent = (JComponent)editor.getDateEditor();
        editorComponent.addAncestorListener(new AncestorListener() {

            @Override
            public void ancestorAdded(AncestorEvent event) {
                ((JComponent)editor.getDateEditor()).requestFocusInWindow();
            }

            @Override
            public void ancestorRemoved(AncestorEvent event) {}

            @Override
            public void ancestorMoved(AncestorEvent event) {}

        });
    }

    @Override
    public Object getCellEditorValue() {
        return editor.getDate();
    }    

    @Override
    public boolean isCellEditable(EventObject anEvent) {
        if (anEvent instanceof MouseEvent) {
            return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
        }
        return true;
    }

    @Override
    public boolean shouldSelectCell(EventObject anEvent) {
        return true;
    }

    @Override
    public boolean stopCellEditing() {
        fireEditingStopped();
        return true;
    }

    @Override
    public void cancelCellEditing() {
        fireEditingCanceled();
    }




    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        if(value instanceof java.util.Date){
            editor.setDate((java.util.Date)value);
//            table.setRowHeight((int)editor.getPreferredSize().getHeight());
            //This last one is optional. It fits the row height to the JDateChooser preferred height.
        }
        return editor;
    }
}

Ele funciona, mas como disse eu disse “ele está tendo uma reação estranha”… Segue as imagens:

Essa imagem mostra ele ainda com foco na célula depois de escolher uma data
1

E aqui mostra ele sem o foco
2

Gostaria q ele mantivesse a data igual antes de perder o foco.

1 Resposta

Matheus_Bigai_Ferrei

Olá,
Sei que esse tópico está aberto a muito tempo, mas eu consegui resolver o problema deste código, segue abaixo:

Primeiro setei um DateFormat com o formato da data desejado:

DateFormat dataNormal = new SimpleDateFormat(“dd/MM/yyyy”);

Depois só informei ela no retorno da data:

@Override
     public Object getCellEditorValue() {
         if (editor.getDate() != null) {
            return dataNormal.format(editor.getDate());
        }
        return null;
     }

Espero que isso possa ajudar mais alguém que ficou na dúvida.
E parabéns Rafaaw pelo código funcional, me deu varias ideias de como trabalhar com JTable.

Criado 8 de fevereiro de 2018
Ultima resposta 18 de mai. de 2020
Respostas 1
Participantes 2