Re:Selecionar linha em JTable

17 respostas
V

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.

17 Respostas

V

Você já fez

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

L

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());

L

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

L

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.

L

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.

L

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

Att, Alcides Liberali

G

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

G

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

Obrigado, Guilherme

G

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

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

G

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

G

Valeu cara!

Vou tentar!

G

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

G

Continua a mesma coisa.

Clico e nao seleciona. Inclui a linha

textField.getSelectedText();

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

G

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

G

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!

G

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

valeu!

G

blz!

[email removido]

Valeu!!!

Criado 27 de agosto de 2007
Ultima resposta 28 de ago. de 2007
Respostas 17
Participantes 3