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.
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 JTable
s 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 {
}
}