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 MouseEvents, 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.

Foi útil?

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.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top