Criar JTable costumizada [Resolvido]

Olá pessoal,

Sou iniciante nessa parte de Swing e estou tomando uma surra para criar uma table, segui uns tutoriais do Mark e do Vinny como exemplo, porém, não consigo alterar o tamanho de uma coluna, não deixar o usuário alterar a sequência dessas colunas, inserir sempre o scroller e etc… Alguém pode dar uma olhada no meu código e ver o que estou fazendo de errado ou deixando de fazer??

Obrigada!!!

TableModel

    //  Implementação da tabela de clientes
    public class ClienteTableModel extends AbstractTableModel {

      /**
      * Essa lista armazenará os objetos do tipo {@link Cliente} atualmente
      * exibidos na tablela.
      */
        private  List<Cliente> clientes;

      // ==============================================================
      // Construtores.
      // ==============================================================


      /**
      * Constutor que simplesmente instancia o nosso {@link List} que usaremos
      * para guardar os valores.
      */

        public ClienteTableModel() {
         // no construtor, instanciamos o List
         clientes = new ArrayList<Cliente>();
     }



     /**
      * Criamos um construtor de conveniência para já popular a lista.
      *
      * @param lista
      *            a lista de clientes a ser adicionada.
      */
     public  ClienteTableModel(List<Cliente> listadeCliente) {
         this();
         clientes.addAll(listadeCliente);
         System.out.println("Temos ["+clientes.size()+"] na lista");
     }



        /*
        ========================================
                Métodos Implementados
        ========================================
         */
       public int getRowCount() {
            return clientes.size();
        }

        public int getColumnCount() {
            return 4;
        }


        //Estas são todas as colunas dos atributos referentes ao Cliente
        @Override
        public String getColumnName(int coluna) {
            // vamos retornar o nome de cada coluna

            switch (coluna) {
            case 0:
                return "Nome"; // o nome da primeira coluna
            case 1:
                return "Bairro"; // o nome da segunda
            case 2:
                return "Rua";
            case 3:
                return "Número";
       
            default:
                return "";
            }
        }


        @Override
        public Class getColumnClass(int col) {
              return String.class;
//            return getValueAt(0, col).getClass();

        }


        //Refente a todos os atributos do cliente

        public Object getValueAt(int linha, int coluna) {
         Cliente cli = (Cliente) clientes.get(linha);

         // façamos um switch
         switch (coluna) {
         case 0:
             return cli.getNome(); // retornamos o nome
         case 1:
             return cli.getBairro(); // retornamos o sobrenome
         case 2:
             return cli.getRua(); // e o apelido
         case 3:
             return cli.getNumero(); // e o apelido
         default:
             return null; 
            }

        }


        @Override
        public boolean isCellEditable(int linha, int coluna) {
             // nesse caso, todas as células NÃO são editáveis
          return false;
         }


         @Override
         public void setValueAt(Object valor, int linha, int coluna) {
         // aqui devemos atualizar o valor de nossos Clientes
         // vemos em qual linha ele está
         Cliente cli = clientes.get(linha);
                  // e vemos o que será atualizado
         switch (coluna) {
         case 0:
             cli.setNome(valor.toString()); // mudamos o nome
             break;
         case 1:
             cli.setBairro(valor.toString()); // mudamos o sobrenome
             break;
         case 2:
             cli.setRua(valor.toString()); //
             break;
         case 3:
             cli.setNumero(valor.toString()); // 
             break;

         }


         // é importante notificar os listeners a cada alteração
         fireTableDataChanged();

     }
...

View

public class ConsultarClienteForm extends JFrame {


    private ClienteTableModel tb;
    private int valorSelecionado;
    private String selectedComboBoxItem;
    private String parametroConsulta;

    
    /** Creates new form Consil - Construtor*/
    public ConsultarClienteForm() {
        this.setTitle("Consultar Clientes");
        this.instanciaTable();
        initComponents(); //inicia os componentes encapsulados pelo netbeans
       // this.centralizar();
        this.populaComboBox();
        System.out.println("Fim do construtor");
       
    }

    private void instanciaTable(){
   
        tb = new ClienteTableModel();
   //  ClienteJpaController cjpac = new ClienteJpaController();
   //   tb.adicionaLista(cjpac.findClienteEntities()); //chamando este método eu preencho a tabela com todos os clientes
        jTable1 = new JTable(tb);
        jTable1.getTableHeader().setReorderingAllowed(false); //Não deixa o usuário mexer na sequencia das colunas
        jTable1.getColumnModel().getColumn(0).setPreferredWidth(150); //largura da coluna
        jTable1.getColumnModel().getColumn(1).setPreferredWidth(150); //largura da coluna
        jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //permite selecionar apenas uma linha na tabela
        jTable1.setModel(tb);

        JScrollPane scroller = new JScrollPane(jTable1);
        scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scroller.setViewportView(jTable1);
        scroller.setAutoscrolls(true);

        getContentPane().add(scroller);
        this.setVisible(true);

        }
...

Você só falou em características da view, então, para isso, pouco importa seu TableModel.

Para alterar o tamanho da coluna, você deve primeiro definir o autoResizeMode para nenhum:

Ou o JTable irá redimensionar as colunas sozinha.

Outra coisa, você deve usar o ColumnModel para definir a largura das colunas:

Para deixar o scroll sempre visível, você deve mexer no ScrollPane. Ele controla isso:

seuScrollPane.setHorizontalBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); seuScrollPane.setVerticalBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

Note que você também pode fazer isso pelo construtor:

seuScrollPane = new JScrollPane(suaTable, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

PS: Eu geralmente não gosto de limitar meu usuário. Sugira uma ordem, mas pq bloquea-lo de redimensionar colunas? Deixe ele decidir o que importa para ele. Nas minhas aplicações, deixo a opção até dele dizer que colunas serão ou não visíveis.

Oi Vini,

O problema é que parece que a table simplesmente ignora tudo o que eu seto para ela fazer. Eu já havia colocado o “auto resize off”, as configurações de scroll no construtor e etc, etc etc…
Já li que a tabela é renderizada depois de alimentada e volta para o estado inicial. O problema é que minha table é inicializada da forma que eu não coloquei.

Obrigada!!!

  public ConsultarClienteForm() {
        this.setTitle("Consultar Clientes");
        this.instanciaTable();
        initComponents(); //inicia os componentes encapsulados pelo netbeans
       // this.centralizar();
        this.populaComboBox();
        System.out.println("Fim do construtor");
       
    }

    private void instanciaTable(){
   
        tb = new ClienteTableModel();
   //  ClienteJpaController cjpac = new ClienteJpaController();
   //   tb.adicionaLista(cjpac.findClienteEntities()); //chamando este método eu preencho a tabela com todos os clientes
        jTable1 = new JTable(tb);
        jTable1.setModel(tb);
        jTable1.getTableHeader().setReorderingAllowed(false); //Não deixa o usuário mexer na sequencia das colunas
        jTable1.getColumnModel().getColumn(1).setWidth(300); //largura da coluna
        jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //permite selecionar apenas uma linha na tabela

        JScrollPane scroller = new JScrollPane(jTable1, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        scroller.setViewportView(jTable1);

        getContentPane().add(scroller);
        this.setVisible(true);

        }


Poste o código completo do form. Se for muito longo, use a opção de Attachments do GUJ (fica logo abaixo da caixa onde vc escreve a dúvida).

Vlw Vini,

Tá em anexo!!

Obrigada.

Como eu imaginei. Você está criando 2 JTables nesse Frame. Uma delas, o Netbeans cria para você, e deve ser a que você vê na tela. A outra vc instancia no método instaciaTable.

Passe a usar um JTable só.

Eu e minha falta de tato com o netbeans!! rsrsrs

Vlw Vini, obrigada!!

JScrollPane scroller = new JScrollPane(jTable1); scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scroller.setViewportView(jTable1); scroller.setAutoscrolls(true);

Eu uso o netbeans, nesse caso eu queria que a jtable ficasse com a barra de rolagem vertical sempre visivel, mesmo não tendo varias linhas.
onde eu colocaria este codigo?
achei que era no codigo de pós-criacao mas não funcionou…

Desde ja agradeço.