Re:Selecionar linha em JTable

Tente:

Outra coisa. Sempre que for fazer tabela, escreva seu próprio Model, filho de AbstractTableModel, ao invés de usar o modelo Default. É mais fácil, deixa o código mais limpo e mais flexível.

Você já fez

tabela.setCellSelection(false); //Precisa estar false! tabela.setRowSelection(true);

Entao conseguiu resolver a seleção de multiplas celulas?

Bem, para selecionar o texto todo costumo usar o seguinte:

seuField.setSelectionStart(0); seuField.setSelectionEnd(texto.length());

tenta por o evento no mouseReleased() em vez do mouseClicked()

Bem, neste caso sugiro que implemente um cell editor proprio, fiz um esboço de como ficaria mais ou menos:

public class SuaClasseCellEditor extends AbstractCellEditor implements TableCellEditor {

    private JTextField textField;

    public SuaClasseCellEditor() {
        textField = new JTextField();
        textField.setBorder(null);
    }

    public Object getCellEditorValue() {
        return textField.getText();
    }

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

Nao se esqueça de na sua tableModel, no método isCellEditable(int rowIndex, int columnIndex) setar a edição desta coluna como true.

Como gostaria que seu textField ficasse? Sempre visivel ou visivel somente quando a celula esta com foco?

Caso seja somente quando a celula receber o foco, tem que usar a classe que te mostrei antes para sincronizar com o dado que é lançado na table com o textField. Caso contrario terá que mexer alguma coisa na sua cellRenderer.

hehehe, faça o seguinte… me mande seu e-mail que te encaminho um exemplo funcional mais completo.

Att, Alcides Liberali

Olá,

Possuo um tabela (JTable) criada a partir de um DefaultTableModel.
Quando clicar em determinada cell da tabela, de uma especifica coluna, preciso selecionar toda a linha dessa cell.
Já fiz várias tentativas com os possíveis métodos de seleção de colunas e linhas de JTable e até agora nao tive o resultado que queria.
Uma das tentativas que achei mais provável é a seguinte:

table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

table.setColumnSelectionAllowed(false);
table.setRowSelectionAllowed(true);

table.setColumnSelectionInterval(0, 7);

Pelo que entendi dessa implementação, deveriam ser selecionadas as colunas 0 a 7 da linha da respectiva cell selecionada.

Mas o que ocorre é que somente a cell da coluna 7 da respectiva linha é selecionada, e não toda as cells da linha do intervalo de colunas.

Já tentei outras implementações de selecao de colunas ao invés de linhas e nao obtive sucesso, somente UMA cell é selecionada em todos os casos.

Como fazer para selecionar um bloco de cells ou uma linha inteira??

Teria algo a ver com o model que implementei minha JTable??

Obrigado, Guilherme

Eu já estou implementando meu proprio TableModel. É uma subclasse de DefaultTableModel, mas só sobrescrevi o método isCellEditable().

Obrigado, Guilherme

acrescentei essa linha:
table.getSelectionModel().setSelectionInterval(linhaInicial, linhaFinal);

mas nao adiantou, continua da mesma forma. Acho q precisarei implementar o listenter da tabela.

Fiz, mas agora minha dúvida é com outra coisa.
Preciso selecionar todo o conteúdo de uma cell quando clico sobre ela. A cell já é editável. Quando clico somente uma vez, o cursor fica piscando no local da cell clicado, mas preciso que todo o conteudo seja selecionado com somente um clique.
Já tentei verificar isso no mouseClick(), mas parece nao ter tido sucesso.

Obrigado, Guilherme

Valeu cara!

Vou tentar!

Favor verificar se não está faltando nada em meu código:

//Adicionei um JTextField na respectiva coluna editável.
JTextField textField = new JTextField();
table.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(textField));

//No listener mouseClicked(), inclui a seguinte verificacao
JTextField textField = (JTextField)table.getColumnModel().getColumn(colunaSelecionada).getCellEditor().getTableCellEditorComponent(table, “”, true, linhaSelecionada, colunaSelecionada);
textField.setSelectionStart(0);
textField.setSelectionEnd(1);

Nao está selecionando nada do meu texto. Preciso fazer mais alguma coisa?

Obrigado, Guilherme

Continua a mesma coisa.

Clico e nao seleciona. Inclui a linha

textField.getSelectedText();

após as linhas de seleção e retorna null!!

Valeu cara,

Fiz algo parecido:

Esse é o codigo de criação do textField para as respectivas cell da coluna.
TextEMax é uma subclasse de JTextField;

TextEMax textField = new TextEMax();
table.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(textField));

Adiciono as linhas no model de minha tabela. Oberve que para coluna[3],
incluo um JTextField e nao uma String.

for (int i = 0; i < linhas; i++) {
arrayDados[0] = valorAtualAzimute;
arrayDados[1] = “Calcular”;
arrayDados[2] = “Calcular”;
TextEMax textField = new TextEMax();
table.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(textField));
textField.setText(“1”);
arrayDados[3] = textField;
//arrayDados[3] = “1”;
arrayDados[4] = “Calcular”;
arrayDados[5] = “Calcular”;
arrayDados[6] = “Calcular”;
arrayDados[7] = “Calcular”;

model.addRow(arrayDados);

valorAtualAzimute += intervalo;
}

No evento mouseClicked(), incluo o codigo para selecao do texto.

table.addMouseListener(new MouseAdapter(){

public void mouseClicked (MouseEvent event){

int colunaSelecionada = table.getSelectedColumn();
int linhaSelecionada = table.getSelectedRow();
if (colunaSelecionada == 3){

table.getCellSelectionEnabled();
if (event.getClickCount() == 1){
table.setCellSelectionEnabled(true);

String valorCell = (String)table.getColumnModel().getColumn(colunaSelecionada).getCellEditor().getCellEditorValue();

TextEMax textField = (TextEMax)table.getColumnModel().getColumn(colunaSelecionada).getCellEditor().getTableCellEditorComponent(table, valorCell, true, linhaSelecionada, colunaSelecionada);
textField.getText();

//Seleção do texto. textField.setSelectionStart(0);
textField.setSelectionEnd(textField.getText().length()-1);
}
}
}
});

O problema dessa implementação é q o texto nao é selecionado quando clico na cell do JTextField. Sabe o que está ocorrendo?

Vou tentar a sua implementacao…

Obrigado, Guilherme

Acho q nao faz diferença. Pode ser quando a cell receber o foco mesmo.

Essa forma como estou criando as linhas está correta??
Observe q para a coluna [3], incluo uma String como valor inicial.
Se fizer assim, não é ativado o evento mouseClicked() quando clico na coluna.

for (int i = 0; i < linhas; i++) {
arrayDados[0] = valorAtualAzimute;
arrayDados[1] = “Calcular”;
arrayDados[2] = “Calcular”;
arrayDados[3] = “1”;
arrayDados[4] = “Calcular”;
arrayDados[5] = “Calcular”;
arrayDados[6] = “Calcular”;
arrayDados[7] = “Calcular”;

model.addRow(arrayDados);

valorAtualAzimute += intervalo;
}

A outra forma de inicializar a coluna é:

for (int i = 0; i < linhas; i++) {
.
.
.
SuaClasseCellEditor editor = new SuaClasseCellEditor();
arrayDados[3] = editor.getTableCellEditorComponent(table, “1”, true, i, 3);
.
.
.
}

Para cada cell da coluna[3], adiciono nao uma String, mas o JTextField retornado de SuaClasseCellEditor.

Devo setar tanto o editor de minha cell da coluna[3],
table.getColumnModel().getColumn(3).setCellEditor(new SuaClasseCellEditor());

quando cada linha inicial da tabela, como mostrado acima??

Devo estar te confundindo todo…hehehehe…

Valeu pela ajuda!

Na frase "quando cada linha inicial da tabela, como mostrado acima??"
substitua “quando” por “quanTo”

valeu!

blz!

guilhermebrgo@yahoo.com.br

Valeu!!!