Fazendo um editável célula JTable - mas * não * clicando duas vezes
-
13-09-2019 - |
Pergunta
Eu estou tentando adicionar uma coluna para um JTable
com o comportamento seguinte (semelhante ao Windows Explorer e conchas semelhantes):
- A célula pode ser clicado uma vez para selecioná-lo, como de costume.
- A célula pode ser clicado duas vezes para executar uma ação separada (iniciar um programa externo.)
- O valor de células (uma cadeia) ainda pode ser editada, por um único clicar uma segunda vez (após uma pausa) ou premindo F2 quando a célula é realçado.
must duplo clique não gatilho edição da célula, mas eu gostaria de deixar qualquer outro padrão de editar gatilhos operacional, se possível.
Eu tentei adicionar um MouseListener
para a mesa, e consumir todos os MouseEvent
s, mas isso não funciona - se eu voltar true
de isCellEditable()
então meu ouvinte nunca recebe quaisquer eventos de clique, mas se eu voltar false
então F2 obras não mais.
Isso pode ser conseguido usando apenas ouvintes de eventos? Eu preferiria não mexer com as funções PLAF se eu puder evitá-lo.
Solução
Você terá que fazer o seu próprio cellEditor e ovveride
public boolean isCellEditable( EventObject e )
Você pode distinguir entre clique simples e dupla com o clickCount na eventObject
Se seu um único clique e sua em uma célula selecionada você pode retornar verdadeiro, caso contrário return false;
recuperar linha e coluna com
int row = ( (JTable) e.getSource() ).rowAtPoint(e.getPoint());
int column = ( (JTable) e.getSource() ).columnAtPoint(e.getPoint());
para permitir F2 você pode adicionar personalizado inputMap en ActionMap entradas
similar too
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown");
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction());
e de sua ação pode, em seguida, disparar o cellediting-se
table.editCellAt(row, column );
Outras dicas
O DefaultCellEditor tem um método setClickCountToStart () ao rato de controlo para a edição. O padrão é 2. Mudar esta não terá nenhum efeito sobre a funcionalidade F2.
Portanto, você pode definir a edição a ser um triplo clique.
Não tenho certeza exatamente como lidar com dois cliques simples para começar a editar, mas eu acho que você usaria um temporizador para acompanhar o primeiro clique e, em seguida, fazer a edição, se o segundo clique único está dentro de você intervalo de tempo.
Eu ter resolvido este envolvendo a CellEditor
existente com um Proxy
e interceptando chamadas para isCellEditable
, retornando false para todos os eventos de mouse e delegar todas as outras chamadas para o CellEditor
originais.
Este é um pouco mais complexo do que a solução de camickr mas funciona para todos os editores (tenho 4 no total.)