REDIMENSIONAR JTABLE - pra variar [ Resolvido ]

Como faço pra redimensionar o JTable em tempo de execução . Gostaria que o JTable da minha interface ficasse no tamanho ideal pra conter todas as colunas e linhas de dados que tem e não que ele ocupasse todo o painel .

   1. public class Usuario {  
   2.     private String login;  
   3.     private String senha;  
   4.     private Integer idade ;  
   5.       
   6.       
   7.       
   8.     public Usuario(String login, String senha, Integer idade) {  
   9.         super();  
  10.         this.login = login;  
  11.         this.senha = senha;  
  12.         this.idade = idade;  
  13.     }  
  14.       
  15.     public String getLogin() {  
  16.         return login;  
  17.     }  
  18.     public void setLogin(String login) {  
  19.         this.login = login;  
  20.     }  
  21.     public String getSenha() {  
  22.         return senha;  
  23.     }  
  24.     public void setSenha(String senha) {  
  25.         this.senha = senha;  
  26.     }  
  27.     public Integer getIdade() {  
  28.         return idade;  
  29.     }  
  30.     public void setIdade(Integer idade) {  
  31.         this.idade = idade;  
  32.     }  
  33.       
  34.       
  35.   
  36. }  
  37.   
  38. import java.awt.BorderLayout;  
  39. import java.util.List;  
  40.   
  41. import javax.swing.JPanel;  
  42. import javax.swing.JTable;  
  43.   
  44. import javax.swing.table.DefaultTableModel;  
  45.   
  46.   
  47.   
  48. public class Table extends JPanel{  
  49.     List<Usuario> usuarios ;  
  50.     private String tableString[][];  
  51.     private String titulos[] = {"login","senha","idade"};  
  52.       
  53.     public Table(List<Usuario> usuarios) {  
  54.         this.setUsuarios(usuarios);  
  55.         tableString = new String[usuarios.size()][3];  
  56.         buildTable();  
  57.         DefaultTableModel defaultTableModel = new DefaultTableModel(tableString , titulos);;  
  58.         JTable table = new JTable(defaultTableModel);  
  59.         table.setEnabled(false);  
  60.         this.setLayout(new BorderLayout());  
  61.         this.add(table,BorderLayout.CENTER);  
  62.     }  
  63.   
  64.     public void buildTable(){  
  65.         int i = 0;  
  66.         for(Usuario usuario : usuarios) {  
  67.             tableString[i][0] = usuario.getLogin();  
  68.             tableString[i][1] = usuario.getSenha();  
  69.             tableString[i][2] = ""+usuario.getIdade();  
  70.             i++;  
  71.         }  
  72.           
  73.     }  
  74.   
  75.     public List<Usuario> getUsuarios() {  
  76.         return usuarios;  
  77.     }  
  78.   
  79.   
  80.     public void setUsuarios(List<Usuario> usuarios) {  
  81.         this.usuarios = usuarios;  
  82.     }  
  83.       
  84.       
  85.   
  86. }  
  87. import java.awt.BorderLayout;  
  88. import java.util.ArrayList;  
  89. import java.util.List;  
  90.   
  91. import javax.swing.JFrame;  
  92.   
  93.   
  94. public class Principal {  
  95.     public static void main(String[] args) {  
  96.         List<Usuario> usuarios = new ArrayList<Usuario>();  
  97.         Usuario u1 = new Usuario("Cleyton","1234",21);  
  98.         usuarios.add(u1);  
  99.         Usuario u2 = new Usuario("Cleydson","abcd",15);  
 100.         usuarios.add(u2);  
 101.         Usuario u3 = new Usuario("Ana","asdf",35);  
 102.         usuarios.add(u3);  
 103.         Usuario u4 = new Usuario("Caetano","a234",45);  
 104.         usuarios.add(u4);  
 105.           
 106.         Table table= new Table(usuarios);  
 107.           
 108.         JFrame frame = new JFrame();  
 109.           
 110.         frame.setSize(300, 300);  
 111.         frame.setLayout(new BorderLayout());  
 112.         frame.getContentPane().add(table);  
 113.         frame.setVisible(true);  
 114.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
 115.           
 116.     }  
 117.   
 118. }  

Alguem pode me ajudar.

Vc na verdade quer redimencionar a janela acredito…

use no lugar de setSize()
o metodo pack() da sua JFrame.
apos ele se quiser centralizar a janela na tela use setLocationRelativeTo(null)

Obg pela resposta …
Bem na verdade não , pensando bem talvez , o que eu preciso redimensionar e o painel que contem a tabela pra ficar do tamanho ideal .
Não sei se vcs vão entender.

package Table;
public class Usuario {    
	private String login;    
	private String senha;    
	private Integer idade ;    



	public Usuario(String login, String senha, Integer idade) {    
		super();    
		this.login = login;    
		this.senha = senha;    
		this.idade = idade;    
	}    

	public String getLogin() {    
		return login;    
	}    
	public void setLogin(String login) {    
		this.login = login;    
	}    
	public String getSenha() {    
		return senha;    
	}    
	public void setSenha(String senha) {    
		this.senha = senha;    
	}    
	public Integer getIdade() {    
		return idade;    
	}    
	public void setIdade(Integer idade) {    
		this.idade = idade;    
	}    

}    
package Table;

import java.awt.BorderLayout;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Table extends JPanel{    
	List<Usuario> usuarios ;    
	private String tableString[][];    
	private String titulos[] = {"login","senha","idade"};    

	public Table(List<Usuario> usuarios) {    
		this.setUsuarios(usuarios);    
		tableString = new String[usuarios.size()][3];    
		buildTable();    
		DefaultTableModel defaultTableModel = new DefaultTableModel(tableString , titulos);;    
		JTable table = new JTable(defaultTableModel);    
		table.setEnabled(false);    
		this.setLayout(new BorderLayout());    
		this.add(table,BorderLayout.CENTER);    
	}    

	public void buildTable(){    
		int i = 0;    
		for(Usuario usuario : usuarios) {    
			tableString[i][0] = usuario.getLogin();    
			tableString[i][1] = usuario.getSenha();    
			tableString[i][2] = ""+usuario.getIdade();    
			i++;    
		}    

	}    

	public List<Usuario> getUsuarios() {    
		return usuarios;    
	}    


	public void setUsuarios(List<Usuario> usuarios) {    
		this.usuarios = usuarios;    
	}    



} 

package Table;

import java.awt.BorderLayout;    
import java.util.ArrayList;    
import java.util.List;    

import javax.swing.JFrame;    



public class Principal {    
	public static void main(String[] args) {    
		List<Usuario> usuarios = new ArrayList<Usuario>();    
		Usuario u1 = new Usuario("Cleyton","1234",21);    
		usuarios.add(u1);    
		Usuario u2 = new Usuario("Cleydson","abcd",15);    
		usuarios.add(u2);    
		Usuario u3 = new Usuario("Ana","asdf",35);    
		usuarios.add(u3);    
		Usuario u4 = new Usuario("Caetano","a234",45);    
		usuarios.add(u4);    

		Table table= new Table(usuarios);    

		JFrame frame = new JFrame();    

		frame.setSize(300, 300);    
		frame.setLayout(new BorderLayout());    
		frame.getContentPane().add(table);    
		frame.setVisible(true);    
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    

	}    

}    

Esse não e o projeto que estou fazendo mas serve de exemplo.
A tabela ta ocupando um espaço no painel que não deveria queria que o painel ficasse do tamanho da tabela.

complicado amigo, esta dificil de entender o que vc deseja…
senti falta de um JScrollPane ai na tua tabela, sera que nnao é isso que vc quer?

[quote]Esse não e o projeto que estou fazendo mas serve de exemplo.
A tabela ta ocupando um espaço no painel que não deveria queria que o painel ficasse do tamanho da tabela.[/quote]

Oi,

Como você está utilizando Layout no frame principal a sua JTable está ocupando o painel inteiro.

Então, o que você quer?

Tchauzin!

Realmente sei que é dificil visualizar o que estou falando , na verdade acho que nem eu entendo direito o que quero.
De novo : esse JTable tem um tamanho x, o painel onde ele esta contido é maior que ele ( o frame é irrelevante ) - no netbeans isso pode ser visualizado melhor a tabela é maior do que o espaço que suas celulas ocupam .
O que eu quero é uma maneira de descobrir qual o tamanho da tabela e redimensiona-la nesse tamanho.


Oi,

Como eu disse, você está utilizando o BorderLayout.

Comente a linha abaixo e acrescente uma cor de fundo para seu painel e veja o que acontece: (Classe Table)

//this.setLayout(new BorderLayout());    
this.add(table,BorderLayout.CENTER);    
this.setBackground(Color.BLACK);

Tchauzin!

entendi o que vc quer…

o seu problema é o que a Lina falou…
o seu layout esta esticando a tabela para o conteudo do seu painel…
na verdade vc esta trabalhando com a JTable de maneira incorreta…
na hora que for adicionar o JTable no painel

faça isso:

seuPainel.add(new JScrolPanel(suaTabela));

Consegui add a foto…
Bem 6 tão vendo que a tabela é maior que o painel tanto que as margens da tabela tão aparecendo.Quero que essas linhas sumam.

[quote=dyorgio]assim por cima eu sugeriria o seguinte HACK:

[code]
// apos carregar os dados da tabela
seuPainel.setPreferredSize(suaTabela.getPreferredSize().getWidth(),seuPainel.getPreferredSize().getHeight());

// ou
seuPainel.setPreferredSize(suaTabela.getPreferredSize());

[/code][/quote]

Oi,

Se não estou enganada, o método setPreferredSize() só aceita um parâmetro em sua assinatura… Logo, a solução de número 1 pode ser descartada.

A solução de número 2 podemos considera-la, porém como ele está utilizando um BorderLayout acredito não surtir efeito…

Tchauzin!

[quote=dyorgio]entendi o que vc quer…

o seu problema é o que a Lina falou…
o seu layout esta esticando a tabela para o conteudo do seu painel…
na verdade vc esta trabalhando com a JTable de maneira incorreta…
na hora que for adicionar o JTable no painel

faça isso:

seuPainel.add(new JScrolPanel(suaTabela)); [/quote]

Oi,

Realmente essa seria a melhor opção…

Tchauzin!

Lina, não uso o eclipse para codificar no forum,
por isso erros são normais,

espero no minimo que um programador Java encaixe a dica que dei numa assinatura compativel,
no caso usar um new Dimension(w,h) como parte da solução, pois não sou obrigado a decorar assinatura de todos os metodos,
apenas os conceitos…

e realmente, a solução ñ funcionaria para o que ele deseja, pois o que ele quer ja esta errado desde o começo

o correto quando se trabalha com listas e tabelas é usar o JScrolPane entre o painel e a tabela/lista…

qualquer coisa fora disso fica uma interface com problemas.

[quote=dyorgio]Lina, não uso o eclipse para codificar no forum,
por isso erros são normais,

espero no minimo que um programador Java encaixe a dica que dei numa assinatura compativel,
no caso usar um new Dimension(w,h) como parte da solução, pois não sou obrigado a decorar assinatura de todos os metodos,
apenas os conceitos…[/quote]

Oi,

A minha intenção não foi apontar um erro seu e sim demonstrar que a solução não era adequada para o problema exposto.

Também não compilei o código, porém sei que aquilo não funcionaria neste caso de Layout.

Bom… o que você falou está correto, “o correto quando se trabalha com listas e tabelas é usar o JScrolPane entre o painel e a tabela/lista…”

Tchauzin!

Estou chegando perto da solução , mas ainda não esta ideal - so pra constar no painel da foto eu uso scrolpane , o outro codigo foi so como exemplo.
O codigo real ta assim por enquanto :

DefaultTableModel defaultTableModel = new DefaultTableModel(tableString	, titulos);
			JTable table = new JTable(defaultTableModel);
			JScrollPane jScrollPane = new JScrollPane(table);
			jScrollPane.setPreferredSize(table.getPreferredSize());
			table.setEnabled(false);
			
			panel.add(jScrollPane);  

mas como e possivel ver na foto na tabela apareceu um scroll lateral , mas existe espaço mais que suficiente no painel pra todas as linhas sem o scroll.Novamente grato pela ajuda.

Estou tentando lhe dizer que não esta ficando uma boa interface grafica cara…
acredito que vc soh esteje querendo treinar swing correto?
não vá para esse lado, interface estranha :S

o scrol lateral pode ser desabilitado, consulte o javadoc do JScrollPane.

quando se trabalha com layouts é importante não trabalhar com tamanho fixo dos componentes…

o uso sorreto ai seria

seuPainel.add(new JScrolPane(suaTabela));

e pronto.

o scrollpane ocupando todo o painel e a tabela apenas o que necessita dentro do scrolpane.

isso é o padrão de interface.

  • o - , sim eu não sou experiente em Swing e sim estou fazendo pra aprender.
    Mas estou ajeitando o layout a medida que desenvolvo.
    Estou engatinhando ainda e bem … né pra isso que serve o forum pra tirar duvidas e duvidas eu tnho muitas.
    =P
    Tbm achei feio - vc q viu o outro post viu como os textfields tão deslinhados .
    Obg a tds pela ajuda , assim que conseguir deixar como quero posto a solução.

Mesmo assim eu gostaria de saber que metodo desablita a barra lateral , dei uma olhada na api e encontrei esse metodo :

jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);

Que desabilito a barra lateral como eu queria mas tbm me impediu de enchergar os elementos que ultrapassavam a tabela .
Não existe uma maneira de descobrir qual a altura da tabela ?

Não está diretamente relacionado à sua dúvida, mas é importante dizer: não faça aquela POG para preencher sua tabela. Em outras palavras: [color=red]fuja de DefaultTableModel[/color]!

Crie seu próprio TableModel.

Os motivos para isso podem ser encontrados aqui: http://www.guj.com.br/posts/list/15/149861.java#813171

Tutoriais explicativos podem ser encontrados aqui:


http://www.javasimples.com.br/swing-awt/death-to-defaulttablemodel-abstracttablemodel-rulez

Exemplos podem ser encontrados aqui:
http://www.guj.com.br/posts/list/225793.java#1156821
http://www.guj.com.br/posts/list/149034.java#808003
http://www.guj.com.br/posts/list/132698.java#714736
http://www.guj.com.br/java/231928-morte-definitiva-ao-default-table-model#1399642

Ou você ainda pode usar o ObjectTableModel, criado pelo Marky Vasconcelos. Veja isso: http://markytechs.wordpress.com/2009/05/29/objecttablemodel

Além disso, caso você queira criar componentes mais complexos, é mais que obrigatório criar seu próprio TableModel. Um exemplo é o JTreeTable, que pode ser conferido aqui: http://java.sun.com/products/jfc/tsc/articles/treetable1/

Com esse tanto de link fica ateh dificil escolher qual que agente usa…

http://www.guj.com.br/posts/list/100793.java
http://www.guj.com.br/posts/list/149034.java#808003
http://www.guj.com.br/posts/list/132698.java#714736

Agora fico pensando qual que eu uso!
kkkkk

[quote=pedroroxd]Com esse tanto de link fica ateh dificil escolher qual que agente usa…

http://www.guj.com.br/posts/list/100793.java
http://www.guj.com.br/posts/list/149034.java#808003
http://www.guj.com.br/posts/list/132698.java#714736

Agora fico pensando qual que eu uso!
kkkkk
[/quote]
Pra você ver que possibilidades não faltam… :slight_smile:

Na verdade o primeiro e o último links são implementações mais completas e poderosas (portanto, mais complexas), que costumam resolver qualquer parada. Já os links do meio são exemplos práticos de como você pode implementar seu próprio TableModel.