Problema: JButton+JTable

3 respostas
guilherme.dio

Boa tarde, tentei resolver este meu problema em outro tópico, mas não obtive ajuda, talvez pela falta de detalhes, então estou abrindo este novo mais detalhado e com fotos:

É o seguinte, estou com uma JTable modificada para inserir botões, o AbstractTableModel p/ definir a estrutura de linhas e colunas dela, e por fim usei o TableCellRenderer e o TableCellEditor para poder inserir JButtons e JLabels com imagens, tudo esta aparecendo perfeitamente, os botões executam suas ações do modo correto, porém uma das colunas que é uma coluna com botões, que mudam de imagem e actionperformed de acordo com o que o usuário executar durante o tempo de execuçaõ do programa, está dando problema. Porque quando o usuário clicar no botão a imagem deste botão deveria mudar, porém ela só é trocada quando ele interage novamente com a tabela, clicando em outra linha da tabela, ou em outro botão, ou seja a imagem não é trocada instantaneamente.

Segue abaixo algumas imagens mostrando passo a passo a ação do usuário
Parte I:

Parte II:

Parte III:

Parte IV:

Códigos Fonte:

Método getTableCellRendererComponent do TableCellRenderer

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)  
     {  
         //Component para: Coluna Status
         if(column == clsOrcamentoModel.COL_STATUS)
         {
             boolean status = Boolean.parseBoolean(value.toString());
             if(row >=0 && row < 9)
             {
                 if(status)
                 {
                     renderLabel.setIcon(new ImageIcon(getClass().getResource(IMG_SELECIONADO)));
                 }
                 else
                 {
                     renderLabel.setIcon(new ImageIcon(getClass().getResource(IMG_NAO_SELECIONADO_OBRIGATORIO)));
                 }
             }
             else
             {
                 if(status)
                 {
                     renderLabel.setIcon(new ImageIcon(getClass().getResource(IMG_SELECIONADO)));
                 }
                 else
                 {
                     renderLabel.setIcon(new ImageIcon(getClass().getResource(IMG_NAO_SELECIONADO)));
                 }
             }
             return renderLabel;  
         }

        if(column >= clsOrcamentoModel.COL_ADICIONAR)
         {
             if(hasFocus)  
             {  
                 renderButton.setForeground(table.getForeground());  
                 renderButton.setBackground(UIManager.getColor("Button.background"));  
             }  
             else if(isSelected)  
             {  
                 renderButton.setForeground(table.getSelectionForeground());  
                 renderButton.setBackground(table.getSelectionBackground());  
             }  
             else  
             {  
                 renderButton.setForeground(table.getForeground());  
                 renderButton.setBackground(UIManager.getColor("Button.background"));  
             }
             if(column == clsOrcamentoModel.COL_ADICIONAR)
             {
                 clsOrcamentoModel model = (clsOrcamentoModel) table.getModel();
                 boolean status = Boolean.parseBoolean(model.getValueAt(row, clsOrcamentoModel.COL_STATUS).toString());
                 if(!status)
                 {
                     renderButton.setIcon(new ImageIcon(getClass().getResource(IMG_SELECIONAR)));
                     renderButton.setToolTipText(TIP_SELECIONAR);
                 }
                 else
                 {
                     renderButton.setIcon(new ImageIcon(getClass().getResource(IMG_MODIFICAR)));
                     renderButton.setToolTipText(TIP_MODIFICAR);
                 }
             }
             else
             {
                 renderButton.setIcon(new ImageIcon(getClass().getResource(IMG_EXCLUIR)));
                 renderButton.setToolTipText(TIP_EXCLUIR);
             }
             return renderButton;
         }
         return null;
     }

Método getTableCellEditorComponent do TableCellEditor:

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)  
     {  
         //Component para: Coluna Status
         if(column == clsOrcamentoModel.COL_STATUS)
         {
             boolean status = Boolean.parseBoolean(value.toString());
             if(row >=0 && row < 9)
             {
                 if(status)
                 {
                     editLabel.setIcon(new ImageIcon(getClass().getResource(IMG_SELECIONADO)));
                 }
                 else
                 {
                     editLabel.setIcon(new ImageIcon(getClass().getResource(IMG_NAO_SELECIONADO_OBRIGATORIO)));
                 }
             }
             else
             {
                 if(status)
                 {
                     editLabel.setIcon(new ImageIcon(getClass().getResource(IMG_SELECIONADO)));
                 }
                 else
                 {
                     editLabel.setIcon(new ImageIcon(getClass().getResource(IMG_NAO_SELECIONADO)));
                 }
             }
             return editLabel;  
         }
         
         //Component para: Coluna Adicionar/Excluir
         if(column >= clsOrcamentoModel.COL_ADICIONAR)
         {
             if(column == clsOrcamentoModel.COL_ADICIONAR)
             {
                clsOrcamentoModel model = (clsOrcamentoModel) table.getModel();
                 boolean status = Boolean.parseBoolean(model.getValueAt(row, clsOrcamentoModel.COL_STATUS).toString());
                 if(!status)
                 {
                     editButton.setIcon(new ImageIcon(getClass().getResource(IMG_SELECIONAR)));
                     editButton.setToolTipText(TIP_SELECIONAR);
                 }
                 else
                 {
                     editButton.setIcon(new ImageIcon(getClass().getResource(IMG_MODIFICAR)));
                     editButton.setToolTipText(TIP_MODIFICAR);
                 }
             }
             else
             {
                 editButton.setIcon(new ImageIcon(getClass().getResource(IMG_EXCLUIR)));
                 editButton.setToolTipText(TIP_EXCLUIR);
             }
             return editButton;
         }
         return null;
     }

Pode-se perceber que eu fiz toda uma manipulação para retornar nos gets o component correto com a configuração correta para cada tipo de ação do usuário, então esses métodos pegam um valor na minha AbstractTableModel onde possui uma List guardando booleans, e a aprtir desses booleans é tratada a imagem que irá aparecer em cada JLabel e JButton.
Espero que esteja bem detalhado desta vez e alguem possa me dar uma luz, rsrsrsrs, porque estou a 1 semana travado nesta classe, e não cosnigo resolver…já tentei até mesmo gambiarras como dar pack no frame, mudar seleção via código da JTable, ou repaint no Jpanel da Jtable, mas n deu certo.

Agradeço a atenção e uma boa tarde a todos,
Att. Guilherme Dio.

3 Respostas

ViniGodoy

Onde você muda a imagem no model? E quando vc muda, vc dá um fire para avisar que a célula mudou? O JTable só redesenha se o model avisa a ele que tem que redesenhar. Caso contrário, o renderer sequer será acionado.

guilherme.dio

Sim, inclusive estou usando o AbstractTableModel e no fim do método setValueAt esta o fire:

fireTableCellUpdated(rowIndex, columnIndex);

Não tem como não entrar neste método, já que está no fim do setvalueAt.

Já não sei mais o que pdoe ser não consigo resolver isso, estou ficando doido, rsrsrs

guilherme.dio

Ninguém tem idéia do que pode estar acontecendo?

Alias, não é só isso de erro que esta acontecendo, além deste bug há um que também não faço idéia de como arrumar, porque o JButton não fica no modo selecionado(com cor diferente) quando o mouse passa por cima, ele só fica assim depois que vc da um clique nele, porém se clicar em outro JButton e voltar no anterior ele volta a ficar sem o modo seleção com o mouse em cima

Criado 7 de outubro de 2011
Ultima resposta 7 de out. de 2011
Respostas 3
Participantes 2