Erro com o JSwing e JTable

12 respostas
D

Boa tarde;

Eu estou com um erro meio estranho na minha janela grafica.Tipo eu começo executando a aplicação, e ele não mostra a JTable que eu criei.

Mas quando eu dou uma ajeitada manual no tamanho da janela, seja pra mais ou pra menos, ele então começa a exibir.E apartir daquele momento que começou a exibir ele continua exibindo corretamente.

Porem porque ele não começa exibindo logo que eu começo o programa? Já aconteceu isso com alguem aqui?

Coloquei algumas fotos em anexo pra entenderem melhor.




12 Respostas

ViniGodoy

Se o setVisible da sua janela estiver dentro do seu construtor, tire ele de lá.

D

Não, na verdade eu não implementei nenhum construtor

O setVisible de todos os meus componentes eu estou setando como true, fora de construtores.

Na verdade essa minha JTable esta dentro de um JScrollPane.

Mas o estranho é que TODOS tão setados como true.Conversei com um pessoal mais experiente da faculdade, eles nunca viram esse negócio de ter que muda o tamanho da janela (pra mais ou PRA MENOS) para ter que aparecer um componente.

O que acontece é as vezes sua janela ta muito pequena e não mostra o componente, dai voce tem que aumentar ela um pouco manualmente.


erico_kl

Isso parece ser um problema de repaint…
Isso que vou falar é gambiarra mas tente chamar um repaint() após a criação do seu frame… Mas de qualquer forma mesmo se der certo, poste o seu código

D

Vish o projeto é grande, e tem um monte de coisa encapsulada.

De qualquer jeito se quiser dar uma olhada…

O que é importante ta só na view, o resto é exceção e Model.

erico_kl

Mas esse problema acontece em todos os JFrames? Senão, poste somente a classe em que o problema ocorre…

D

beleza,

Segue em anexo a classe

erico_kl
Você poderia ter postado ela direto, com as tags "code":
package View;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.LinkedList;

import javax.print.DocFlavor.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.border.TitledBorder;

import Model.Tabela;

public class Interface extends JFrame{
	
	private JToolBar toolbar = new JToolBar();
	private TabelaGrafica minhaTabela = new TabelaGrafica();
	
	public JToolBar getToolbar() {
		return toolbar;
	}

	public void setToolbar(JToolBar toolbar) {
		this.toolbar = toolbar;
	}

	public TabelaGrafica getMinhaTabela() {
		return minhaTabela;
	}

	public void setMinhaTabela(TabelaGrafica minhaTabela) {
		this.minhaTabela = minhaTabela;
	}
	
	public Interface(){
		super("Interface Grafica!");
	}
	
	public void criaInterface(){
	   
	   Container pane = this.getContentPane();
	   pane.setLayout(new BorderLayout());
	   
	   // adiciona o toolbar no topo
	   pane.add(BorderLayout.NORTH, toolbar);
	   this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	   this.setSize(850,700);
	   this.setVisible(true);
	   
	   
	   //chama o metodo da classe Botoes responsavel por gerar os botoes
	   Botoes botoes = new Botoes();
	   ArrayList<JButton> meusBotoes = botoes.listaDeBotoes();
	   for(int i = 0; i < meusBotoes.size();i++){
			toolbar.add(meusBotoes.get(i));
		}

		
		//defini o novo icone do programa.No caso, o icone nao será mais a xicara da Sun
		//ImageIcon imagemTituloJanela = new ImageIcon("C//Users/Wilner/workspace/Trabalho I - OO avancada/bin/View/IconesIcones/bd.png");
		java.net.URL url = this.getClass().getResource("Icones/bd.png");  
		Image imagemTitulo = Toolkit.getDefaultToolkit().getImage(url);  
		this.setIconImage(imagemTitulo);
		
		//cria um objeto de tabela grafica para trabalhar com a JTable
		JPanel pnTable = criaPainel (null);
		pane.add(BorderLayout.SOUTH,pnTable);
		repaint();
		
	}
	

	public JPanel criaPainel (Tabela tabelaNegocio) {
		
		 Botoes botoes = new Botoes();
		 
		 //Exemplo
		 
		 Tabela tabelaAux = new Tabela("Exemplo");
		 
		 LinkedList<String> teste =  new LinkedList<String>();
		 LinkedList<String> aux =  new LinkedList<String>(); 
		 teste.add("Nome");
		 teste.add("Telefone");
		 teste.add("Faculdade");
		 teste.add("Sexo");
		 teste.add("EU");
		 teste.add("EU");
		 teste.add("EU");
		 tabelaAux.insereNovaLinha(teste);	 
		 aux.add("Luis");
		 aux.add("54623223");
		 aux.add("UCS");
		 aux.add("M");
		 aux.add("M");
		 aux.add("M");
		 aux.add("M");
		 tabelaAux.insereNovaLinha(aux);
		 
		 LinkedList<Boolean> flag =  new LinkedList<Boolean>();
		 flag.add(false);
		 flag.add(true);
		 flag.add(false);
		 flag.add(false);
		 flag.add(false);
		 flag.add(false);
		 flag.add(false);
		 tabelaAux.setNullChecker(flag);
		 
		 LinkedList<Boolean> bla =  new LinkedList<Boolean>();
		 bla.add(true);
		 bla.add(false);
		 bla.add(false);
		 bla.add(false);
		 bla.add(false);
		 bla.add(false);
		 bla.add(false);
		 tabelaAux.setPrimaryKey(bla);
		 
		 LinkedList<Integer> hey =  new LinkedList<Integer>();
		 hey.add(2);
		 hey.add(2);
		 hey.add(2);
		 hey.add(3);
		 hey.add(3);
		 hey.add(3);
		 hey.add(3);
		 tabelaAux.setTipo(hey);

		 
		 //fimExemplo
		
		 JTable tabela = minhaTabela.criarTabelaGrafica(tabelaAux);
		 JPanel pnTable = new JPanel();
		 
		 
		 JScrollPane scrollTable;
		 scrollTable = new JScrollPane();
		 scrollTable.setViewportView(tabela);
		 scrollTable.setEnabled(false);
		 scrollTable.setVisible(true);
		 scrollTable.setPreferredSize(new Dimension(750,550));
		 
		 pnTable.add(botoes.botaoADD());
		 pnTable.add(botoes.botaoDelete()); 
		 pnTable.setBorder(new TitledBorder("Trabalho de OO Avancada!"));
		 pnTable.setBounds(20, 20, 370, 230);
		 pnTable.add(BorderLayout.SOUTH,scrollTable);
		 pnTable.setVisible(true);
		 
		 
		 return pnTable;
	}

}
Veja que, ao contrário do que você disse, você está implementando o construtor padrão somente referenciando a classe pai (JFrame).. Olhe a linha 44. Talvez esteja fantando chamar o método criaInterface() nele
D

assim:

public Interface(){
		super("Interface Grafica!");
		criaInterface();
	}

Vixi mesmo assim não funfou.

O estranho é que os botões sempre ficam visiveis, logo de cara.Só a JTable que eu adicionei na Pane(atraves de um JScrollPane) é que não aparece.Por isso acho que o problema não esteja na interface em si, e sim na JScrollPane ou na propia JTable talvez

ViniGodoy

Mova o setVisible para a ultima linha do criaInterface…

D

VIxi Vini,

Você deve entender só um pouquinho de Java hein…

Funcinou cara, muito obrigado!

OBS: Mostrei pra meio mundo na faculdade ninguem soube hehe

ViniGodoy

Detalhe que eu já estava cantando a bola do setVisible desde o primeiro post.
Você não deve deixar a janela visivel enquanto a está construindo, seja no construtor ou num outro método, como você fez.

D

É a minha primeira aplicação gráfica em java, voce tinha falado e eu nao tinha entendido, dei mole mesmo…
de qualquer forma obrigado de novo!

abrass

Criado 14 de outubro de 2012
Ultima resposta 14 de out. de 2012
Respostas 12
Participantes 3