JSpinner na JTable

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!

E isso mesmo que eu quero, so que está acontecendo isso o que eu posso fazer??

Att


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