JTable JScrollPane [RESOLVIDO]

Bom dia amigos

Eu preciso fazer um trabalho para a faculdade, é um programa em java para uma loja de tapetes, que envolve banco de dados e mais algumas coisas. Ainda estou no começo e já apareceram alguns problemas, eu estou tentado criar uma tabela de teste mas não consigo mostrar os títulos das colunas.

Eu procurei no fórum e na maioria das vezes a solução para este problema foi colocar a tabela em um JScrollPane, o problema é que já fiz isso. Será que estou fazendo alguma outra coisa errada?

[code]import java.awt.;
import javax.swing.
;

public class Design extends JFrame {

public Design () {		
	setTitle ("Design Tapetes");
	setSize (700, 700);		
	Container cp = getContentPane ();			
	
	JTabbedPane jtp = new JTabbedPane ();		
	cp.add (jtp);
	
	JPanel pedido = new JPanel ();
	pedido.setLayout (null);
	
	JLabel nome = new JLabel ("Nome:");
	JLabel sobrenome = new JLabel ("Sobrenome:");
	JLabel cpf = new JLabel ("CPF:");
	
	JTextField camponome = new JTextField ();
	JTextField camposobrenome = new JTextField ();
	JTextField campocpf = new JTextField ();
	
	JButton incluir = new JButton ("Incluir");
	JButton atualizar = new JButton ("Atualizar");
	JButton listar = new JButton ("Listar");
	JButton excluir = new JButton ("Excluir");		
	
	JPanel cliente = new JPanel ();
	JPanel preco = new JPanel ();
	
	String [] colunas = {"CPF", "Nome", "Sobrenome"};		
	String [][] dados = {
							{"Teste", "Teste", "Teste"},
							{"Teste", "Teste", "Teste"},
							{"Teste", "Teste", "Teste"}
						};
	
	JTable tabela = new JTable (dados, colunas);		
	JScrollPane jsp = new JScrollPane (tabela);		
	tabela.setSize (300, 200);				
	
	nome.setBounds (10, 10, 100, 10);		
	pedido.add (nome);	
	
	sobrenome.setBounds (10, 40, 100, 10);
	pedido.add (sobrenome);
	
	cpf.setBounds (10, 70, 100, 10);
	pedido.add (cpf);		
	
	camponome.setBounds (110, 8, 500, 20);
	pedido.add (camponome);

	camposobrenome.setBounds (110, 37, 500, 20);
	pedido.add (camposobrenome);
	
	campocpf.setBounds (110, 65, 500, 20);
	pedido.add (campocpf);			
	
	incluir.setBounds (191, 150, 100, 30);
	pedido.add (incluir);
			
	atualizar.setBounds (296, 150, 100, 30);
	pedido.add (atualizar);
	
	listar.setBounds (401, 150, 100, 30);
	pedido.add (listar);
	
	excluir.setBounds (506, 150, 100, 30);
	pedido.add (excluir);		
	
	pedido.add (tabela);
	pedido.add (jsp);
	tabela.setLocation (300, 300);	
	
	jtp.addTab ("Cliente", cliente);		
		
	jtp.addTab ("Pedido", pedido);		
	
	jtp.addTab ("Preço do Material", preco);					
}

public static void main (String [] args) {		
	Design design = new Design ();
	design.setVisible (true);
}

}[/code]

Desde já agradeço.

1 curtida

Eu prefiro ir criando os componentes e ir setando a localização e tamanho e ja ir colocando no JPanel, acredito que fique mais fácil de encontrar erros.

Refiz o código fazendo comentários, caso tenha alguma dúvida, é só perguntar…

[code]import java.awt.;
import javax.swing.
;
import javax.swing.table.DefaultTableModel;

public class Design extends JFrame {

public Design () { 
	//Definições do JFrame
    setTitle ("Design Tapetes");  
    setSize (700, 700);       
    Container cp = getContentPane ();             
    
    //Criando JTabbedPane e adicionando ao JFrame
    JTabbedPane jtp = new JTabbedPane ();         
    cp.add (jtp);  
    
    //Criando o JPanel pedido com Layout null
    JPanel pedido = new JPanel ();  
    pedido.setLayout (null);  
     
    //Criando as JLabel's, definindo tamanho e localização e adicionando ao JPanel pedido
    JLabel nome = new JLabel ("Nome:"); 
    nome.setBounds (10, 10, 100, 10);         
    pedido.add (nome);
    
    JLabel sobrenome = new JLabel ("Sobrenome:");
    sobrenome.setBounds (10, 40, 100, 10);  
    pedido.add (sobrenome);
    
    JLabel cpf = new JLabel ("CPF:");
    cpf.setBounds (10, 70, 100, 10);  
    pedido.add (cpf);
    
    //Criando os JTextField's, definindo tamanho e localização e adicionando ao JPanel pedido
    JTextField camponome = new JTextField ();  
    camponome.setBounds (110, 8, 500, 20);  
    pedido.add (camponome);
    
    JTextField camposobrenome = new JTextField (); 
    camposobrenome.setBounds (110, 37, 500, 20);  
    pedido.add (camposobrenome);
    
    JTextField campocpf = new JTextField ();  
    campocpf.setBounds (110, 65, 500, 20);  
    pedido.add (campocpf);
      
    //Criando os JButton's, definindo tamanho e localização e adicionando ao JPanel pedido
    JButton incluir = new JButton ("Incluir");  
    incluir.setBounds (191, 150, 100, 30);  
    pedido.add (incluir);  
    
    JButton atualizar = new JButton ("Atualizar"); 
    atualizar.setBounds (296, 150, 100, 30);  
    pedido.add (atualizar);  
    
    JButton listar = new JButton ("Listar");
    listar.setBounds (401, 150, 100, 30);  
    pedido.add (listar);  
    
    JButton excluir = new JButton ("Excluir"); 
    excluir.setBounds (506, 150, 100, 30);  
    pedido.add (excluir);         
     
    //Criando JScrollPane, configurando tamanho e localização e adicionando no JPanel pedido
    JScrollPane scrollPane = new JScrollPane();
	scrollPane.setBounds(240, 200, 300, 200);
	pedido.add(scrollPane);
	
	//Criando a JTable tabela e adicionando no JScrollPane
    JTable tabela = new JTable();
	scrollPane.setViewportView(tabela);
	tabela.setModel(new DefaultTableModel(
		new Object[][] {
				{"Teste", "Teste", "Teste"},  
                {"Teste", "Teste", "Teste"},  
                {"Teste", "Teste", "Teste"},
		},
		new String[] {
				"CPF", "Nome", "Sobrenome"
		}
	)); 
    
    //Criando os JPanel's cliente e preco
    JPanel cliente = new JPanel ();  
    JPanel preco = new JPanel (); 
    
    //Adicionando os JPanel's ao JTabbedPane
    jtp.addTab ("Cliente", cliente);          
    jtp.addTab ("Pedido", pedido);        
    jtp.addTab ("Preço do Material", preco);                      
}  
  
public static void main (String [] args) {        
    Design design = new Design ();  
    design.setVisible (true);  
}  

} [/code]

Obrigado wesleyosilva, mas você poderia explicar o que eu tinha feito de errado na tabela?

Você coloca a tabela em cima de um JScrollPane, e depois você deve adicionar o JScrollPane ao form, não a tabela.

No caso, o correto seria remover a linha 74 do seu código, e deixar só a 75.

ViniGodoy

Ainda assim o meu código não funcionou. De qualquer maneira, o wesleyosilva já respondeu com um código funcionando. Obrigado a todos que ajudaram. Pode fechar, resolvido.

É você mesmo que marca o tópico como resolvido. Vá ao seu PRIMEIRO post, edite-o e escreva [Resolvido] na frente do título.
Não existe isso de tópico “fechado”.

Outra coisa, procure ler com atenção a lista de fóruns antes de postar. Seu tópico pertencia ao fórum de interface gráfica, não de Java Básico.

Finalmente, se você não entendeu qual era o problema, então não deveria considerar o problema resolvido. Caso contrário, logo, logo, você vai errar de novo, e o wesley não vai estar lá para te ajudar.

Rodei seu programa aqui a correção é a seguinte:
a) Adicionar somente o JScrollPane ao painel, conforme eu já havia falado antes;
b) Retirar o setSize da tabela e fazer um setBounds no JScrollPane. Sem isso, o tamanho e a posição dele ficam zerados, por isso você não o enxerga.

Coloquei um exemplo igual ao seu código para você ver:

[code]import java.awt.;
import javax.swing.
;

public class Design extends JFrame {

public Design () {		
	setTitle ("Design Tapetes");
	setSize (700, 700);		
	Container cp = getContentPane ();			
	
	JTabbedPane jtp = new JTabbedPane ();		
	cp.add (jtp);
	
	JPanel pedido = new JPanel ();
	pedido.setLayout (null);
	
	JLabel nome = new JLabel ("Nome:");
	JLabel sobrenome = new JLabel ("Sobrenome:");
	JLabel cpf = new JLabel ("CPF:");
	
	JTextField camponome = new JTextField ();
	JTextField camposobrenome = new JTextField ();
	JTextField campocpf = new JTextField ();
	
	JButton incluir = new JButton ("Incluir");
	JButton atualizar = new JButton ("Atualizar");
	JButton listar = new JButton ("Listar");
	JButton excluir = new JButton ("Excluir");		
	
	JPanel cliente = new JPanel ();
	JPanel preco = new JPanel ();
	
	String [] colunas = {"CPF", "Nome", "Sobrenome"};		
	String [][] dados = {
							{"Teste", "Teste", "Teste"},
							{"Teste", "Teste", "Teste"},
							{"Teste", "Teste", "Teste"}
						};
	
	JTable tabela = new JTable (dados, colunas);		
	JScrollPane jsp = new JScrollPane(tabela);		
	jsp.setBounds(10, 200, 300, 200);				
	
	nome.setBounds (10, 10, 100, 10);		
	pedido.add (nome);	
	
	sobrenome.setBounds (10, 40, 100, 10);
	pedido.add (sobrenome);
	
	cpf.setBounds (10, 70, 100, 10);
	pedido.add (cpf);		
	
	camponome.setBounds (110, 8, 500, 20);
	pedido.add (camponome);

	camposobrenome.setBounds (110, 37, 500, 20);
	pedido.add (camposobrenome);
	
	campocpf.setBounds (110, 65, 500, 20);
	pedido.add (campocpf);			
	
	incluir.setBounds (191, 150, 100, 30);
	pedido.add (incluir);
			
	atualizar.setBounds (296, 150, 100, 30);
	pedido.add (atualizar);
	
	listar.setBounds (401, 150, 100, 30);
	pedido.add (listar);
	
	excluir.setBounds (506, 150, 100, 30);
	pedido.add (excluir);		
	
	pedido.add (jsp);
	tabela.setLocation (300, 300);	
	
	jtp.addTab ("Cliente", cliente);		
		
	jtp.addTab ("Pedido", pedido);		
	
	jtp.addTab ("Preço do Material", preco);					
}

public static void main (String [] args) {		
	Design design = new Design ();
	design.setVisible (true);
}

}[/code]

Outra coisa, seu código exibe uma série de más práticas, que vão te dar muitíssima dor de cabeça se você prosseguir com elas:
a) Você usa o DefaultTableModel. Ele não deveria ser usado para aplicações mais sérias. É imprescindível que você aprenda a fazer seu próprio TableModel antes de manipular um JTable;
b) Você não está usando os LayoutManagers. Eles dispensam totalmente o uso de setBounds, tornam a tela mais fácil de programar, e ainda permitem que o usuário a redimensione. Sem eles, a aplicação também não será multiplataforma.
c) Convém separar a criação de cada componente em seu próprio método.

Achei interessante a parte dos layout managers, por perceber que também não uso :stuck_out_tongue:
Será que é por esse motivo, que quando estou montando a interface gráfica no netbeans, os componentes ficam se redimensionando sozinhos e meu cabelo ficando bagunçado?

Além desse tutorial: http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html, conhecem algum outro legal?

Abraços,

http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
http://www.miglayout.com/QuickStart.pdf

[quote=Bruno M Gasparotto]Achei interessante a parte dos layout managers, por perceber que também não uso :stuck_out_tongue:
Será que é por esse motivo, que quando estou montando a interface gráfica no netbeans, os componentes ficam se redimensionando sozinhos e meu cabelo ficando bagunçado?

Além desse tutorial: http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html, conhecem algum outro legal?

Abraços,[/quote]

Sim, sim e sim…

Passei por poucas e boas com esses componentes malandros que se redimensionam sozinhos. E programar interface gráfica é quase uma arte, é necessário bastante conhecimento e prática até conseguir fazer interface bonitas e funcionais…

E a principal coisa que não se pode esquecer, e que foi muito cobrada no meu TCC de final de curso foi a questão do redimensionamento, que dá um toque de profissionalismo ao seu programa.

ViniGodoy

Não é bem uma questão de má prática, eu optei por colocar a localização dos componentes manualmente porque eu ainda estou testando a tela, depois é claro que eu usarei Grids, mesmo porque o programa vai exigir isso. E quanto ao DefaultTableModel, vou procurar aprendar a utilizar o TableModel como você sugeriu.

Já ao fato de ter colocado o tópico no fórum “Java Básico”, é porque eu tenho conhecimentos básicos de Java, hehe, mas na próxima vez colocarei a dúvida no fórum pertinente.

Novamente agradeço a ajuda de todos, vou colocar o tópico como resolvido.

Abraços.

[quote=ViniGodoy]http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
http://www.miglayout.com/QuickStart.pdf[/quote]
Achei bem interessante o Mig Layout, já havia visto comentários aqui no forum mas nunca parei pra ler. Vou ver agora.
Obrigado Vini.

[quote=Ruttmann][quote=Bruno M Gasparotto]Achei interessante a parte dos layout managers, por perceber que também não uso :stuck_out_tongue:
Será que é por esse motivo, que quando estou montando a interface gráfica no netbeans, os componentes ficam se redimensionando sozinhos e meu cabelo ficando bagunçado?

Além desse tutorial: http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html, conhecem algum outro legal?

Abraços,[/quote]

Sim, sim e sim…

Passei por poucas e boas com esses componentes malandros que se redimensionam sozinhos. E programar interface gráfica é quase uma arte, é necessário bastante conhecimento e prática até conseguir fazer interface bonitas e funcionais…

E a principal coisa que não se pode esquecer, e que foi muito cobrada no meu TCC de final de curso foi a questão do redimensionamento, que dá um toque de profissionalismo ao seu programa.[/quote]
Sendo assim eu preciso realmente estudar sobre layout managers, pois esse está sendo meu maior problema ao criar interfaces, e eu ficava bravo era com o netbeans haha.
Fica o aprendizado :slight_smile: