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 .
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.
[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.
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.
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
[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…
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
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…”
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.
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.
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]!
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/
Agora fico pensando qual que eu uso!
kkkkk
[/quote]
Pra você ver que possibilidades não faltam…
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.