Mostrar TableViewer não em linha, mas em ordem matriz
-
09-09-2019 - |
Pergunta
Eu uso o TableViewer para mostrar informações em uma tabela. O usuário pode selecionar uma das opções mostradas selecionando uma linha da tabela.
Eu quero criar uma mesa em forma de matriz, no qual o usuário não só pode selecionar a linha. Deve ser possível selecionar todos os itens da tabela, como a linha 2 coluna 3. Para cada seleção de item de uma ação é chamada para lidar com este item como é na TableViewer.
Tanto quanto eu agora, eu posso adicionar CellModifier e CellEditors para a linha de colunas da tabela, mas a referência para a ação é sempre o objeto de linha e não o TableItem selecionado.
Será que alguém tem um exemplo de como criar uma tal matriz dentro de um Composite? Eu posso criá-lo, definindo um GridLayout e adicionando os componentes em um loop for, mas do que eu recebo problemas, quando eu quiser redesenhar o Composite com novas crianças. faz o TableViewer já tem essa manipulação, então eu não quero implementá-lo novamente.
Solução
Eu tive o mesmo problema há um tempo atrás e que a única maneira que eu encontrei para resolver era para registrar um ouvinte do mouse sobre a mesa de SWT elemento associado ao espectador mesa.
MouseListener columnSelectionMouseListener = new ColumnSelectionMouseListener();
getViewer().getTable().addMouseListener(columnSelectionMouseListener);
public class ColumnSelectionMouseListener implements MouseListener {
private TableColumn selectedColumn;
@Override
public void mouseDoubleClick(MouseEvent e) {
// Nothing to do here
}
@Override
public void mouseDown(MouseEvent e) {
table = (Table) e.widget;
TableItem item = table.getItem(new Point(e.x, e.y));
for (int i = 0; i < table.getColumnCount(); i++) {
TableColumn column = table.getColumn(i);
Rectangle bounds = item.getBounds(i);
if (bounds.contains(e.x, e.y)) {
selectedColumn = column;
}
}
}
@Override
public void mouseUp(MouseEvent e) {
// Nothing to do here
}
public TableColumn getSelectedField() {
return selectedColumn;
}
}
Então, por exemplo, no ouvinte selecção do espectador, você pode pedir para o ouvinte do mouse a coluna que foi selecionado quando o mouse foi pressionado e que combinam com a linha selecionada vindo de selecção do espectador para executar a ação apropriada.
Espero que isso pode ajudar.
Manu
Outras dicas
Talvez o seguinte trecho JFace vai ajudar: Snippet058CellNavigationIn34
Ingo