Pergunta

Existem bons livros ou website que vão sobre a criação de um JTable? Eu quero fazer um editável coluna. Gostaria de realmente colocar um componente JCheckBox herdado (que criamos aqui) em uma das colunas da tabela em vez de apenas ter a JCheckBox mesa colocar em com base no mesmo sendo um campo boolean editável.

Eu tenho o JFC balanço Tutorial Second Edition livro, mas eu só faria gostaria de saber se há outros exemplos que eu poderia olhar e aprender a lidar com os quadros melhores. O livro parece apenas tomar o java 'trilha' on-line e colocá-lo no livro.

Estou relendo o material, porém, apenas curioso, se alguém encontrou algo que poderia ajudar mais.

Foi útil?

Solução

Para fazer uma coluna editável você tem que substituir o método isCellEditable na TableModel. Criando um TableModel é bastante fácil se você AbstractTableModel herdar e eu recomendo para todos, mas os JTables mais simples.

No entanto, a adaptação do TableModel é apenas parte do que você precisa fazer. Para chegar realmente um componente personalizado no JTable, você precisa definir um renderizador de célula personalizado. Para usar um componente personalizado interativo, você precisa definir um editor de célula personalizado. Em alguns casos, é o suficiente para usar versões ligeiramente modificated das classes padrão para isso.

Editores

Se você já tem um componente personalizado é feito facilmente usando a delegação: Criar uma nova classe de implementação TableCellEditor, e retornar a Novo instância do componente no método getCellEditorComponent. Os paramaters para este método incluem o valor atual, bem como as coordenadas de célula, um link para a tabela e tempo ou não a célula é selecionada.

O TableCellEditor também tem um método que é chamado quando o usuário submete uma alteração ao conteúdo da célula (onde você pode validar a entrada do usuário e ajustar o modelo) ou cancela uma edição. Certifique-se de chamar o método stopEditing() em seu editor, se você editar sempre programaticamente abort, caso contrário, o componente de edição permanecerá na tela - isso uma vez me levou como 2 horas para depuração

.

Note que dentro de editores JTable e única editores receber eventos! Exibindo um botão pode ser feito usando um renderizador. Mas, para obter um botão de funcionamento, você precisa implementar um editor com o EventListeners correta registrado. Registrar um ouvinte em um renderizador não faz nada.

Renderers

A implementação de um processador não é estritamente necessário para o que você descreve na sua pergunta, mas você normalmente acabam fazendo isso de qualquer maneira, mesmo que apenas por pequenas modificações. Renderers, ao contrário de editores, são a velocidade crítica. O getTableCellRendererComponent de um representante é chamado uma vez para cada célula na tabela! O componente retornado por um processador só é usado para pintar a célula, não para a interação e, portanto, pode ser "reutilizado" para a próxima célula. Em outras palavras, você deve ajustar o componente (por exemplo, usando setText(...) ou setFont(...) se é um TextComponent) no processador, você deve não instanciar um novo - que é uma maneira fácil de prejudicar o desempenho.

Advertências

Note que, para prestadores e editores para trabalhar, você precisa dizer ao JTable quando usar um determinado processador / editor. Existem basicamente duas maneiras de fazer isso. Você pode definir o renderizador de célula padrão / editor para um determinado tipo usando os respectivos métodos JTable. Para esta forma de trabalho, o seu TableModel precisa retornar exatamente esse tipo no método getColumnClass(...)! O modelo de tabela padrão será não fazer isso por você, ele sempre retorna Object.class. Tenho certeza que se tem confundido muita gente.

A outra maneira de definir o editor / processador está colocando explicitamente na própria coluna, isto é, fazendo com que o TableColumn através do método getTableColumn(...) do JTable. Isto é muito mais elaborado, no entanto, é também a única maneira de ter dois renderizadores diferentes / editores para uma única classe. Por exemplo. o seu modelo pode ter duas colunas de classe String que são prestados em maneiras completamente diferentes, talvez uma vez usando um JLabel/DefaultRenderer eo outro usando um JButton para o acesso de um editor mais elaborado.

JTable com seus prestadores personalizados e editores é extremamente versátil, mas também é uma responsabilidade muito grande, e há um monte de coisas para fazer errado. Boa sorte!

Como usar tabelas em The Swing Tutorial é leitura obrigatória para JTables qualquer personalização. Em particular, ler e reler Conceitos: Editores e Renderers , porque normalmente leva um tempo para que ele "clique". Os exemplos de prestadores personalizados e editores são também muito interessante.

Outras dicas

A classe que você quer olhar para estendendo-se para criar o seu próprio comportamento é DefaultTableModel. Isso permitirá que você definir o seu próprio comportamento. Um tutorial decente pode ser encontrada no site do sol .

Este tutorial do java átrio é fácil de seguir. A trilha balanço on-line para JTable que você referência indica que foi atualizado. Você percorrer a coisa toda para uma possível melhor (não mais recente é sempre melhor) informação?

Se você está tentando usar um JTable simples com editável 1 coluna e você saber o local coluna você pode sempre usar o modelo de tabela padrão e sobrecarregar a chamada isCellEditable.

algo como isto:

myTable.setModel(new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int column) {
    if (column == x) {
        return true;
    } else
        return false;
}
});

E para a caixa de seleção criar uma classe renderizador

MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer

Algumas classes úteis são:

Package javax.swing.table:

TableModel - Interface para um tablemodel AbstractTableModel - agradável classe para estender para criar a sua própria mesa com estruturas de dados personalizados DefaultTableModel - modelo de tabela padrão que pode lidar com arrays[] e Vectors

Para desativar a edição em qualquer célula que você precisa para substituir o método isCellEditable(int row, int col)

em sua mesa Modelo, você deve substituir e funções "isCellEditable" "setValueAt", como abaixo.
A coluna 4 é a coluna para células editáveis.
Então, quando você clicar duas vezes na célula e digite algo,
setValueAt () será chamado e salvar o valor para fazer do TableModel, campo col4.

public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table

@Override
public boolean isCellEditable(int row, int col) {
    if (col == 4) {
        return true;
    } else {
        return false;
    }
}

@Override
public void setValueAt(Object value, int row, int col) {
    if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) {
        if (col == 4) {
            tbmData.get(row).col4= (String) value;
        }
        fireTableCellUpdated(row, col);
    } else {
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top