[Resolvido] Erro ao invocar um método ou setar variável de outra tela

3 respostas
E

Boa tarde pessoal, criei um tópico recentemente http://www.guj.com.br/java/248327-melhor-forma-de-instanciar-as-telas-e-manipula-las/2#1289141 , para pedir ajuda com um problema que tinha ao instanciar as telas, este resolvi graças a DEUS, porém, surgiu um novo que tem ligação com o anterior. A descrição abaixo tbm esta no outro, mas ninguém respondeu e como ja tentei de tudo e não consegui estou recorrendo a outro topico para ver se consigo alguém que possa me ajudar.

Criei duas classes de controle, ControledeTelas -que controla as chamadas de métodos, setar variáveis, referenciar algo… - e ChamaTelas, que é onde instancio as telas.

Em várias telas eu preciso acessar métodos e as vezes até mesmo instanciar alguma variavel em outra tela, um exemplo é a tela de ConsultaCliente, ela é necessária em algumas telas, como venda e cadastrodeCliente. Preciso setar um variável para determinar qual tela esta invocando a consulta e saber onde vou restaurar, acontece que ao antes eu chamava tudo direto do Frame, por exemplo: ConsultaClienteVIEW.chamadoPorCadCliente = true; , eu utilizava a própria classe, ao invés de fazer ConsultaClienteVIEW consultaClienteVIEW = new ConsultaClienteVIEW(); ConsultaClienteVIEW.chamadoPorCadCliente = true;, mas era necessário deixar as variáveis, funções, ou até mesmo os componentes utilizados dessa forma como o static, e automaticamente, todos métodos que os utilizavam, e novamente todos os compomentes dentro desse métodos tbm, assim, proticamente tudo ficava static, sei que provavelmente é errado, mas estou aprendendo, então vou melhorando a cada nova descoberta, mas o problema surgiu agora, onde ao instanciar a tela eu fechava a primeira vez corretamente, mas quando instaciava a segunda vez, não davadispose();de forma alguma.

Ao descobrir isso através do outro topico, eu retirei todos os static e joguei tudo isso para a “ControleTela”, assim fica tudo maravilhosamente lindo, até a hora que eu preciso utiliza-las, quando eu tento instanciar alguma variável, chamar algum método ou algo do tipo de outra tela da erro, Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at CTR.ControleTelasCTR.setaCadastroproduto_consultaProduto(ControleTelasCTR.java:29) at VIEW.ProdutoVIEW$6.actionPerformed(ProdutoVIEW.java:363) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$000(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$2.run(Unknown Source) at java.awt.EventQueue$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)
referente a estas linhas: chamaTelaCTR.consultaClienteVIEW.chamadoporvenda = true; onde “chamadoporvenda” é uma boolean, utilizada para o exemplo dado acima!

outro erro é aqui(mesmo erro): (classe ControleTelas) public void restauraProduto_Produto(int cod, boolean parametroPorId){ chamaTelaCTR.produtoVIEW.restaurarDados(cod, parametroPorId); } na linha 2.
não sei o que posso estar fazendo errado, ou se esse não é possível fazer assim, se alguém puder me ajudar, ou até demonstrar maneira melhor de fazer essas chamadas agradeço.

Ficou da seguinte forma(ex): PodutoVIEW() --> ChamaTelaCTR() --> ConsultaProdutoVIEW() --> ControleTelasCTR() (aciona) --> ProdutoVIEW.restaurarProduto();

em código agora: ...//ProdutoVIEW(). btnLocalizar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { controleTelasCTR.setaCadastroproduto_consultaProduto(); // aqui eu seto a variavel boolean para saber "quem" chamou a tela ao restaurar. mas o erro ocorre aqui chamaTelaCTR.chamaConsultaProduto(); }

...//ChamaTelaCTR(). public Window ChamaConsultaProduto(){ if(consultaProdutoVIEW == null) consultaProdutoVIEW = new ConsultaProdutoVIEW(null); consultaProdutoVIEW.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); consultaProdutoVIEW.setLocationRelativeTo(null); consultaProdutoVIEW.setResizable(false); consultaProdutoVIEW.setVisible(true); return consultaProdutoVIEW; }

...//ControleTelaCTR(). public void setaCadastroproduto_consultaProduto(){ chamaTelaCTR.consultaProdutoVIEW.cadastroproduto = true; // ocorre erro aqui. chamaTelaCTR.consultaProdutoVIEW.venda = true; }

...//ConsultaProdutoVIEW public void restaurarDados(int cod){ if(cadastroproduto){ controleTelasCTR.restauraProduto_Produto(cod, true); } }

...//ControleTelasCTR public void restauraProduto_Produto(int cod, boolean parametroPorId){ chamaTelaCTR.produtoVIEW.restaurarDados(cod, parametroPorId); // ocorre erro aqui. }

lembrando que em todos o erro é o mesmo que postei acima!

se alguém encontrar onde ocorre o erro, ou se esta forma é incirreta agradeço muito!

3 Respostas

E
chamaTelaCTR.consultaClienteVIEW.chamadoporvenda = true

Use um debugger, ou use o velho e bom System.out.println, antes dessa linha, e cheque se é a variável chamaTelaCTR que tem valor null ou se é o membro consultaClienteVIEW dessa variável que está com o valor null. Ambos esses problemas podem ocasionar o NullPointerException.

E

De fato entanglement, é o chamaTelaCTR que está null, mas não entendi o porque, ja havia pensado na hipótese, mas acabei não testando.

fiz da seguinte forma a instância:

public class ChamaTelaCTR {
	
	public ConsultaClienteVIEW  consultaClienteVIEW;
	public ClienteVIEW clienteVIEW;
	public VendasVIEW vendasVIEW;
	public ProdutoVIEW produtoVIEW;
	public ConsultaProdutoVIEW consultaProdutoVIEW;
	
	
	public Window abrirConsultaCliente(){
		consultaClienteVIEW = new ConsultaClienteVIEW(null);  
		consultaClienteVIEW.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    		consultaClienteVIEW.setLocationRelativeTo(null);
    		consultaClienteVIEW.setResizable(false);
        	consultaClienteVIEW.setVisible(true);
        	return consultaClienteVIEW;
	}
	
	public Window abrirConsultaProduto(){
			consultaProdutoVIEW = new ConsultaProdutoVIEW(null);  
			consultaProdutoVIEW.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			consultaProdutoVIEW.setLocationRelativeTo(null);
			consultaProdutoVIEW.setResizable(false);
			consultaProdutoVIEW.setVisible(true);
        	return consultaProdutoVIEW;
	}
		
	private Window abrirVendas(){
		vendasVIEW = new VendasVIEW();
       	        vendasVIEW.setVisible(true);
            	vendasVIEW.setLocationRelativeTo(null);
       	        vendasVIEW.setResizable(false);
                return vendasVIEW;
	}
	
	private Window abrirCliente(){
			clienteVIEW = new ClienteVIEW();
			clienteVIEW.setVisible(true);
			clienteVIEW.setLocationRelativeTo(null);
			clienteVIEW.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
			clienteVIEW.setResizable(false);
        return clienteVIEW;
	}
	
	private Window abrirProduto(){
			produtoVIEW = new ProdutoVIEW();
			produtoVIEW.setVisible(true);
			produtoVIEW.setLocationRelativeTo(null);
			produtoVIEW.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
			produtoVIEW.setResizable(false);
        return produtoVIEW;
	}
	
	
	public void chamaVenda(){
		abrirVendas();
	}
	public void chamaCliente(){
		abrirCliente();
	}
	
	public void chamaConsultaCliente(){
		abrirConsultaCliente();
	}
	
	public void chamaConsultaProduto(){
		abrirConsultaProduto();
	}
	
	public void chamaProduto(){
		abrirProduto();
	}
}

só instancio aqui, e não entendo o pq, pois setar uma variável ou chamar uma função eu ja chamei o método

ChamaTelaCTR chamaTelaCTR = new ChamaTelaCTR();
chamaTelaCTR.chamaTeladesejada();
talvez é nesse ponto que estou errando...

... esta dificil!! provavelmente é um erro facil e simples, mas eu não consigo encontrar, pois é a primeira vez que estruturo dessa forma!

obrigado pelo conselho!!

E

Boa tarde pessoal, apareci novamente pra postar a solução que encontrei, e encerrar o tópico! Obrigado a todos, espero que ajude mais alguém. grande abraço a todos!

public class ChamaTelaCTR {
	
	public static ProdutoVIEW produtoVIEW = null;
	
	private static Window abrirProduto(){
		produtoVIEW = new ProdutoVIEW();
		produtoVIEW.setVisible(true);
		produtoVIEW.setLocationRelativeTo(null);			
		produtoVIEW.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
		produtoVIEW.setResizable(false);
        	return produtoVIEW;
	}
	

______________________________

public class ControleTelaCTR{

	public static void restauraProduto_Produto(String cod){
		ChamaTelaCTR.produtoVIEW.restaurarDados(cod);
	}

}




__________________

public class ChamaTelaCTR{

	public void restaurarDados(String cod){
		try{
			...
			...
			...
		}catch(SQLException e){
			e.printStackTrace();
		}
	}

}

______________

// para invocar a tela...

	ChamaTelaCTR.chamaProduto();
Criado 12 de agosto de 2011
Ultima resposta 29 de ago. de 2011
Respostas 3
Participantes 2