Boa tarde, pessoal, como faço para jogar um jSpinner dentro de uma Jtable (AbstractTableModel), e ele acompanhar o tamanho da lista, exemplo se eu tiver 10 linhas na tabela ele vai criar 10 jSpinner, alguem tem alguma ideia?
Obrigado
Boa tarde, pessoal, como faço para jogar um jSpinner dentro de uma Jtable (AbstractTableModel), e ele acompanhar o tamanho da lista, exemplo se eu tiver 10 linhas na tabela ele vai criar 10 jSpinner, alguem tem alguma ideia?
Obrigado
pelo que eu entendi, voce quer q uma das colunas tenha um JSpinner e não um JTextField correto?
entao, não é no AbstractTableModel que você tem que fazer, é no TableColumn
JTable table = new JTable(new Object[][]{ {"23", 23}, {"34", 34}}, new Object[]{"String", "Spnner"});
//apenas para coluna 2
TableColumn column = table.getColumnModel().getColumn(1);
voce vai ter que trocar o Renderer (renderizador desse componente) para um que retorne JSpinner
column.setCellRenderer(new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
JSpinner spinner = new JSpinner();
if (component instanceof JLabel) {
spinner.setValue(Integer.valueOf(((JLabel) component).getText()));
} else if (value != null) {
spinner.setValue(Integer.valueOf(value.toString()));
} else {
System.out.println("Não foi possivel criar Renderer");
}
return spinner;
}
});
agora voce tem que criar o editor
column.setCellEditor(new TableCellEditor()
{
//implemente aqui os metodos necessarios para editar o JSpinner
// olhe a classe DefaultTableCellEditor, ele implementa TableCellEditor para JTextField, JComboBox e JCheckBox
}
);
de uma olhada aqui http://docs.oracle.com/javase/tutorial/uiswing/components/table.html , é ± a mesma ideia que foi feito para o exemplo com cores
ele trocou o Renderer e o CellEditor
abraço!
você colocou em todas as colunas, tem que colocar soh em uma coluna
ah, e voce vai ter que aumentar um pouco a altura das linhas
table.setRowHeight(40);
conseguiu implementar o editor?
abraços
ah, faz um favor também, coloca muda o titulo do topico aqui do forum para algo como “JSpinner na JTable”
E como faço para colocar em só uma coluna?
TableColumn column = table.getColumnModel().getColumn(1); //<- o 1 é o index da coluna 2
qualquer coisa cola o codigo que vc faz o ‘set’ do renderer nas colunas
que te ajudo
Cara você não tem um exemplo mais claro? porfavor ta complicado…
Utilizo está classe…
[code]public class PadraoGridView extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column) {
// component will actually be this.
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
component.setBackground(row%2==0 ? Color.getHSBColor(125,255,145) : Color.LIGHT_GRAY);
JSpinner spinner = new JSpinner();
if (component instanceof JLabel) {
spinner.setValue(Integer.valueOf(((JLabel) component).getText()));
TableColumn column = table.getColumnModel().getColumn(1);
} else if (value != null) {
// spinner.setValue(Integer.valueOf(value.toString()));
} else {
System.out.println("Não foi possivel criar Renderer");
}
return spinner;
// }
//return component;
}
}
[/code]
e seto isso aqui no meu personalizar código, clicando com o direito…
PadraoGridView dtcr = new PadraoGridView();
jTable1.setDefaultRenderer(Object.class, dtcr);
O que eu teria que criar mais, para poder ter esse JSpinner dentro da minha tabela?, ainda está aparecendo em todas as colunas e tambem meio deformados conforme a imagem que mandei a cima, tem algum exemplo?
Obrigado
O que eu teria que criar mais, para poder ter esse JSpinner dentro da minha tabela?, ainda está aparecendo em todas as colunas e tambem meio deformados conforme a imagem que mandei a cima, tem algum exemplo?
Obrigado
cada coluna utiliza um componente renderizador, que vai pintar o componente na tela daquela forma,
exemplo: se voce colocar pro seu Renderer retornar um JTable, ele vai pitnar uma JTable em cada celula da sua tabela
nessa linha voce esta falando pra JTable utilizar seu Renderer para todas as colunas
jTable1.setDefaultRenderer(Object.class, dtcr);
aqui voce diz pra sua tabela pegar a Coluna 2
TableColumn column = table.getColumnModel().getColumn(1); //<- o 1 é o index da coluna 2
e aqui voce fala pra coluna utilizar o Renderizador que voce criou
column.setCellRenderer(new DefaultTableCellRenderer(){
//codigo la de cima que nao precisa repetir
})
sobre o tamanho dos componentes leia os topicos anteriores que eu comentei como alterar a altura da linha na tabela…
abraço
Consegui adicionar ao Jtable certinho, so que agora ele nao gira nenhum numero, o que faço?
Hum… faça o seguinte: crie um JSpinner sozinho em um JDialog, só para testar, e veja o que é necessário para “girar os números”. Provavelmente você terá de associar um SpinnerNumberModel. Veja em:
http://docs.oracle.com/javase/tutorial/uiswing/components/spinner.html
Depois que tiver criado um JSpinner que funcione do jeito que você quer, faça as modificações no seu código.
Eu costumo fazer muito isso quando não sei muito bem como é que as coisas funcionam - faço um programinha bem simples que funciona, e depois copio o que deu certo.
agora voce precisa implementar o Editor, que permite voce editar da forma que o JSpinner realiza a edicao
E como criar este editor?
uma busca rapida no google:
http://www.java2s.com/Code/Java/Swing-JFC/UsingaListJSpinnerasaCellEditorinaJTableComponent.htm
dai é soh voce fazer
column.setCellEditor( objeto do seu SpinnerEditor )
O que eu realmente queria e o seguinte ele ja se encontra dentro da minha Jtable, so que ele nao ‘gira’ numeros,não funciona a flexa pra cima e pra baixo, o que posso fazer?
seguinte…
um componente swing precisa de um Renderizador ( o componente que sera pintado na tela enquanto nao tiver fazendo nada no componente, apenas para mostrar o que voce quer) e um Editor
(para alterar o valor que você esta mostrando)
o que você fez até agora:
na JTable voce trocou o componente de Renderizacao das celulas na coluna X
colocando um renderizador personalizado que retorna um JSpinner (no metodo getTableCellRendererComponent)
column.setCellRenderer(new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
//codigo do componente que vc vai retornar
}
});
Agora o seu componente não esta editando ao clicar na celula, ele aparece como se fosse um JTextField, PQ?
pq quando você tenta editar/alterar o valor na celula X, o seu JTable troca pelo componente de edicao, ou seja, um JTextField
o que você precisa fazer é implementar a interface TableCellEditor (como mostra no exemplo) e alterar o editor da coluna X
cara, tente entender como o swing está organizado e como ele funciona que você consegue até colocar um jogo de cada tipo em cada célula do seu JTable (nao que isso seria util, mas é possível)
o que esta faltando você fazer é só implementar o TableCellEditor
column.setCellEditor( objeto do seu SpinnerEditor(classe que implementa interface TableCellEditor) )
abraços
[code]public class PadraoGridView extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column) {
// component will actually be this.
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
component.setBackground(row%2==0 ? Color.getHSBColor(125,255,145) : Color.LIGHT_GRAY);
JSpinner spinner = new JSpinner();
if(column == 4){
table.setRowHeight(40);
//table.setEditingRow(row);
//if (component instanceof JLabel) {
//spinner.setValue(Integer.valueOf(((JLabel) component).getText()));
//TableColumn column = table.getColumnModel().getColumn(1);
//} else if (value != null) {
//spinner.setValue(Integer.valueOf(value.toString()));
//} else {
//System.out.println("Não foi possivel criar Renderer");
//}
spinner.setModel(new javax.swing.SpinnerNumberModel());
spinner.setEditor(spinner);
return spinner;
} else {
return component;
}
// return component;
}
[/code]
Gente o que estou errando que não estou conseguindo fazer este JSpinner girar?
Já tentei fazer algumas coisas, mas nao da certo utilizar o setEditor… ninguem tem nenhum exemplo bem claro?? obrigado