Redimensionar largura da coluna JTable, scroll e setas para cima e para baixo

lá pessoal

Estou usando o modelo orientado por vcs do GUJ e estou com 3 problemas no meu modelo na JTable.
Primeiro: Quando chamo o meu Jtable ele aparece só que as colunas estão com a mesma largura e quero redimensiona-las. Como fazer isso dentro desse novo modelo?
Segundo: O Scroll não aparece quando chamo a minha jTable. preciso resolver estes 2 problemas se vcs puderem me ajudar agradeceria muito.
Terceiro: As teclas setas não funcionam neste meu modelo. Qual seria o metodo para este procedimento dentro da minha jtable(modelo).O codigo está a baixo:
A parte da chamada do meu modelo:

    private void preencheTbm(){
        PrecoDao dao = null ;
        try {
            dao = new PrecoDao();
            PrecoTableModel minha = new PrecoTableModel(dao.listAll()); 
// peguei na internet esse procedimento mas não tá funcionando
//   [b] tentei fazer desse modo e não funcionou[/b]
//            defineRenderers();
/*            jTPreco.getColumnModel().getColumn(0).setPreferredWidth(50);
            jTPreco.getColumnModel().getColumn(1).setPreferredWidth(150);
            jTPreco.getColumnModel().getColumn(2).setPreferredWidth(50);
            jTPreco.getColumnModel().getColumn(3).setPreferredWidth(250);
            jTPreco.getColumnModel().getColumn(4).setPreferredWidth(50);
            jTPreco.getColumnModel().getColumn(5).setPreferredWidth(150);*///
// [b]esta parte funciona menos o scroll e as setas[/b]
            jTPreco.setPreferredSize(new java.awt.Dimension(800, 160));  
            int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS;
            int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS;
            JScrollPane scroller = new JScrollPane(jTPreco, v, h); 
            jScrollPane2.add(scroller ); 
            jTPreco.setModel(minha);  
            jScrollPane2.setViewportView(jTPreco);  

//            getContentPane().add( jScrollPane2 );
        } catch (SQLException ex) {
            Logger.getLogger(jIFProtese.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            dao.closeConnection();
        } catch (SQLException ex) {
            Logger.getLogger(jIFProtese.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

//Meu modelo de Preço está funcionando bem, menos os 3 problemas citados:

package TableModels;

import java.util.ArrayList;
import java.util.List;
import javax.swing.SwingConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import modelo.Preco;
import modelo.Protese;
import modelo.TipodePreco;

/**
 *
 * @author Octacilio
 */
public class PrecoTableModel extends AbstractTableModel {

  
    private static final long serialVersionUID = 1L;

      
    /* Lista de Preco que representam as linhas. */  
    private List<Preco> linhas;  
  
    /* Array de Strings com o nome das colunas. */  
    private String[] colunas = new String[]{  
    "Id.", "Tipo de Preço                  ", "Id.", "Descrição da Prótese                            ", "Id.", "Valor"};
    /* Cria um PrecoTableModel vazio. */  
    public PrecoTableModel() { 
        System.out.println("passei na PrecoTableModel - inicio!");

        linhas = new ArrayList<Preco>();  
    }  
  
    /* Cria um PrecoTableModel carregado com 
     * a lista de Preco especificada. */  
    public PrecoTableModel(List<Preco> precos) {  
//System.out.println("passei na PrecoTableModel!");
        this.linhas = new ArrayList<Preco>(precos); 
        
/*       linhas = new ArrayList<Preco>(precos);
             for (Preco p: linhas){
                 System.out.println(" Id. Tipopreco=" + (p.getIdtipopreco().toString()));     
                   System.out.println(" Nome Tipo=" + (p.getDescricao()));     
                   System.out.println(" Id.Protese=" + (p.getIdprotese().toString()));     
                   System.out.println("Nome Protese=" + (p.getNomeprotese()));     
                   System.out.println(" Id.=" + (p.getId().toString()));     
                   System.out.println("Preco=" + (p.getPreco()));  
            }*/
    }  
  
  
    /* Retorna a quantidade de colunas. */  
    @Override  
    public int getColumnCount() {  
        // Esta retornando o tamanho do array "colunas".  
//System.out.println("tamanho da coluna=" +colunas.length);        
        return colunas.length;  
    }  
  
    /* Retorna a quantidade de linhas. */  
    @Override  
    public int getRowCount() {  
        // Retorna o tamanho da lista de Preco.  
        return linhas.size();  
    }  
  
    /* Retorna a quantidade de linhas. */  

    public int getColumnModel(int i) {  
        // Retorna o tamanho da lista de Preco.  
        return i;  
    }  
  
    @Override  
    public String getColumnName(int columnIndex) {  
        // Retorna o conteudo do Array que possui o nome das colunas 
//System.out.println("nome da coluna=" +colunas[columnIndex]);     
        return colunas[columnIndex];  
    }  
  
    ;  
  
/* Retorna a classe dos elementos da coluna especificada.
	 * Este método é usado pela JTable na hora de definir o editor da célula. */
	@Override
	public Class<?> getColumnClass(int columnIndex) {
		// Retorna a classe referente a coluna especificada.
		// Aqui é feito um switch para verificar qual é a coluna
		// e retornar o tipo adequado. As colunas são as mesmas
		// que foram especificadas no array "colunas".
		switch (columnIndex) {
		case 0: // Primeira coluna é o nome, que é uma String.
			return Integer.class;
		case 1: // Segunda coluna é o telefone, que também é uma String..
			return String.class;
		case 2: // Terceira coluna é a data de cadastro,
				// apesar de ser do tipo Calendar,
				// estou retornando Degerate por causa da formatação.
			return Integer.class;
		case 3: // Quarta coluna é a mensalidade, um double.
			return String.class;
		case 4: // Quarta coluna é a mensalidade, um double.
			return Integer.class;
		case 5: // Quarta coluna é a mensalidade, um double.
			return Double.class;
		default:
			// Se o índice da coluna não for válido, lança um
			// IndexOutOfBoundsException (Exceção de índice fora dos limites).
			// Não foi necessário verificar se o índice da linha é inválido,
			// pois o próprio ArrayList lança a exceção caso seja inválido.
			throw new IndexOutOfBoundsException("ERRO. Coluna fora do limite - ClassPreco!");
		}
	}
  
    ;  
  
    
  
    @Override  
    public Object getValueAt(int rowIndex, int columnIndex) {  
            Preco preco = linhas.get(rowIndex);  
  
        // Retorna o campo referente a coluna especificada.  
        // Aqui é feito um switch para verificar qual é a coluna  
        // e retornar o campo adequado. As colunas são as mesmas  
        // que foram especificadas no array "colunas".  
        switch (columnIndex) {  
  
            // Seguindo o exemplo: "Tipo","Data de Cadastro", "Nome", "Idade"};  
            case 0:  
                return preco.getIdtipopreco();  
            case 1:  
                return preco.getDescricao();  
            case 2:  
                return preco.getIdprotese();  
            case 3:  
                return preco.getNomeprotese();  
            case 4:  
                return preco.getId();  
            case 5:  
                return preco.getPreco();  
            default:  
                // Isto não deveria acontecer...  
                throw new IndexOutOfBoundsException("Erro - columnIndex fora de limite GetPreco!");  
        }  
    }  
  
@Override  
//modifica na linha e coluna especificada  
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {  
      Preco Preco = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado  
  
     switch (columnIndex) { // Seta o valor do campo respectivo  
         case 0:  
//             Preco.setGrupoPreco(aValue.toString());  
/*                   System.out.println("Id.= " + setGrupoPreco+"");
                   System.out.println("Nome Preco=" + (Preco.getNome()));     
                   System.out.println(" Prazo=" + (Preco.getPrazo().toString()));     
//                   System.out.println(" Id. Grupo=" + (Preco.getGrupoPreco().getId()));     
                   System.out.println(" Nome Grupo=" + (g.getNomegrupo()));*/    
          case 1:  
//             Preco.setGrupoPreco(aValue.toString());  
         case 2:  
//             Preco.setId(aValue.toString());  
         case 3:  
//             Preco.setNome(aValue.toString());  
         case 4:  
//             Preco.setPrazo(aValue.toString());  
  
         default:  
             // Isto não deveria acontecer...               
     }  
     fireTableCellUpdated(rowIndex, columnIndex);  
     }  
  
    //modifica na linha especificada  
    public void setValueAt(Preco aValue, int rowIndex) {  
        Preco preco = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado  
  
        preco.setPreco(rowIndex);  
  
        fireTableCellUpdated(rowIndex, 5);  
  
    }  
    ;  
  
  
    ;  
  
  
    @Override  
    public boolean isCellEditable(int rowIndex, int columnIndex) {  
        return false;  
    }  
  
  
    public Preco getPreco(int indiceLinha) {  
        return linhas.get(indiceLinha);  
    }  
  
  
  
    /* Adiciona um registro. */  
    public void addPreco(Preco m) {  
        // Adiciona o registro.  
        linhas.add(m);  
  
  
        int ultimoIndice = getRowCount() - 1;  
  
        fireTableRowsInserted(ultimoIndice, ultimoIndice);  
    }  
  
    /* Remove a linha especificada. */  
    public void removePreco(int indiceLinha) {  
        linhas.remove(indiceLinha);  
  
        fireTableRowsDeleted(indiceLinha, indiceLinha);  
    }  
  
    /* Adiciona uma lista de Preco ao final dos registros. */  
    public void addListaDePreco(List<Preco> Preco) {  
        // Pega o tamanho antigo da tabela.  
        int tamanhoAntigo = getRowCount();  
  
        // Adiciona os registros.  
        linhas.addAll(Preco);  
  
        fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);  
    }  
  
    /* Remove todos os registros. */  
    public void limpar() {  
        linhas.clear();  
  
  
        fireTableDataChanged();  
    }  
  
    /* Verifica se este table model esta vazio. */  
    public boolean isEmpty() {  
        return linhas.isEmpty();  
    }

    public void setVisible(boolean b) {
        
    }
// retorna a largura da coluca como fazer esse metodo retornar a largura da coluna?
/*    public Object getColumn(int i) {
     switch (i) { // Seta o valor do campo respectivo  
         case 0:  
//               return colunas[columnIndex].setPreferredWidth(200); 
          case 1:  
//             Preco.setGrupoPreco(aValue.toString());  
         case 2:  
//             Preco.setId(aValue.toString());  
         case 3:  
//             Preco.setNome(aValue.toString());  
         case 4:  
//             Preco.setPrazo(aValue.toString());  
  
         default:  
             // Isto não deveria acontecer...               
     }  
//     fireTableCellUpdated( columnIndex);  
        
    }*/

  
}

Agradeceria muito se alguem pudesse me ajudar.

Olá nazaocta,

Voce consegue definir o tamanho das colunas pelo metodo :
modelo.getColumn(0).setPreferredWidth(347);
modelo.getColumn(1).setPreferredWidth(250);
Onde modelo eh um objeto de TableColumnModel.
Logo para aparecer as rolagens horizontais basta setar as colunas maiores do que o tamanho do JSrollPane e as setas verticais serao inseridas quando voce tiver mais elementos na tabela, assim a barra irá aparecer.
O problema das teclas poderia ser resolvido por meio de eventos de teclado, pesquise por KeyListener();

Espero ter ajudado

Olá Kaial

A largura das colunas já está resolvido, agradeço mas as rolagens já testei e tenho mais de 15 linhas na minha tabela de preço e não aparece(Só preciso da barra vertical). Quanto as setas vou verificar o q vc me orientou.
Grato.

Olá.

Por favor, ao postar tópicos não deixe o título inteiro em letras maiúsculas. Além disso, leia com atenção a lista de fóruns, pois sua dúvida é de interface gráfica e não java básico.

Todos os problemas que você está tendo não estão relacionados ao TableModel. Só para confirmar, você colocou a tabela num JScrollPane? E na sequencia, você inseriu no JFrame o ScrollPane e não o JTable, certo?

Vini

Verifiquei e tentei entender o q vc falou. Fiz a alteração e inserir a tabela(jTPreco) no pai acessivel da tabela que no meu caso é o jScrollPane2. Fiz o teste e apareceu a barra vertical na minha tabela, ela rola para baixo e para cima, mas, aparece somente os 10 primeiros registros de preço e tenho no banco 15 registros. Rola mas não aparece os ultimos registros.
Meu codigo agora se encontra assim:

    private void preencheTbm(){
        PrecoDao dao = null ;
        try {
            dao = new PrecoDao();
            PrecoTableModel minha = new PrecoTableModel(dao.listAll()); 
            jTPreco.setModel(minha);  
            jTPreco.setPreferredSize(new java.awt.Dimension(800, 160));  
            defineRenderers();
            int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS;
            int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS;
            JScrollPane scroller = new JScrollPane(); 
            jScrollPane2.setViewportView(scroller);  
            scroller.setViewportView(jTPreco);  

        } catch (SQLException ex) {
            Logger.getLogger(jIFProtese.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            dao.closeConnection();
        } catch (SQLException ex) {
            Logger.getLogger(jIFProtese.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Grato.

Poste o código do método dao.listAll();

Outra coisa. Não é necessário dar fire no método setValueAt. Se o JTable chamou esse método, ela já sabe que a tabela está sendo modificada.
Só é necessário dar fire em métodos que o JTable não chama, mas que precisam avisar a tabela que os dados mudaram, tal como o método add.