JtextArea na célula não funciona muito bem, como proceder?

Pessoal, tenho um celleditor na célula da jtable, para colocar um Jtextarea, mas acontece o seguinte: quando eu estou com foco na célula sem entrar em modo de edição e tento digitar algo, ele não digita nada, mas caso eu dê dois clique que foi a maneira q coloquei e entro em modo de edição, ele escreve normal. O problema é que eu quero q quando estiver em modo de foco e tentar digitar algo, para facilitar, ele entre em modo de edição e digite normalmente. Vou postar um exemplo executável para vocês olharem.

classe funcionario:

public class Funcionario {

    private String nome;

    public Funcionario(String nome, int idade, int matricula) {
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

} 

classe FuncionarioTableModel

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class FuncionarioTableModel extends AbstractTableModel {

    private String colunas[] = {"nome"};
    private ArrayList<Funcionario> funcionarios;
    private final int COLUNA_NOME = 0;


    public FuncionarioTableModel(ArrayList<Funcionario> funcionarios) {
        this.funcionarios = funcionarios;
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }

    @Override
    public int getRowCount() {
        return funcionarios.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public String getColumnName(int indice) {
        return colunas[indice];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case COLUNA_NOME:
                return String.class;
                        default:
                return String.class;
        }
    }


    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Funcionario funcionario = this.funcionarios.get(rowIndex);

        switch (columnIndex) {
            case COLUNA_NOME:
                return funcionario.getNome();
        }
        return null;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Funcionario funcionario = this.funcionarios.get(rowIndex);
        switch (columnIndex) {
            case COLUNA_NOME:
                funcionario.setNome(String.valueOf(aValue));
                break;
        }
        fireTableDataChanged();
    }
}

classe JtableExemple:

import java.awt.Component;
import java.awt.EventQueue;
import java.util.ArrayList;
import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;

public class JTableExample extends JFrame {

    private JTable tabela;
    private JScrollPane scrollPainel;

    public JTableExample() {
        renderizarTela();
    }

    private void renderizarTela() {


    Funcionario f1 = new Funcionario("",0,0);
    Funcionario f2 = new Funcionario("", 0, 0);
    Funcionario f3 = new Funcionario("", 0, 0);
    Funcionario f4 = new Funcionario("", 0, 0);

        ArrayList<Funcionario> funcionarios = new ArrayList<>();
        funcionarios.add(f1);
        funcionarios.add(f2);
        funcionarios.add(f3);
        funcionarios.add(f4);

        FuncionarioTableModel model = new FuncionarioTableModel(funcionarios);

        this.tabela = new JTable(model);
        this.scrollPainel = new JScrollPane(tabela);
        tabela.getColumnModel().getColumn(0).setCellEditor(new TextAreaEditor());
                tabela.setRowHeight(50);
        this.add(scrollPainel);
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }



    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                JTableExample tb = new JTableExample();
                tb.setLocationRelativeTo(null);
                tb.setVisible(true);
            }
        });
    }
}

// celleditor
    class TextAreaEditor extends DefaultCellEditor {

        protected JScrollPane scrollpane;
        protected JTextArea textarea;

        public TextAreaEditor() {
            super(new JCheckBox());
            scrollpane = new JScrollPane();
            textarea = new JTextArea();
            textarea.setLineWrap(true);
            textarea.setWrapStyleWord(true);
//            textarea.setBorder(new TitledBorder("This is a JTextArea"));
            scrollpane.getViewport().add(textarea);

            // colocar para editar em 2 click
            setClickCountToStart(2);
            //
        }

        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
            textarea.setText((String) value);

            return scrollpane;
        }

        public Object getCellEditorValue() {
            return textarea.getText();

        }
    }