JTable JScrollPane [RESOLVIDO]

10 respostas
deamdornelles

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?

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);
	}
}

Desde já agradeço.

10 Respostas

W

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...

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);  
    }  
}
deamdornelles

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

ViniGodoy

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.

deamdornelles

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.

ViniGodoy

É 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:
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);
	}
}

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.

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,

ViniGodoy

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

Ruttmann

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,

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.

deamdornelles

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.

Bruno_M_Gasparotto

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

Achei bem interessante o Mig Layout, já havia visto comentários aqui no forum mas nunca parei pra ler. Vou ver agora.
Obrigado Vini.

Ruttmann:
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,

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.


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:

Criado 23 de setembro de 2012
Ultima resposta 24 de set. de 2012
Respostas 10
Participantes 5