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

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!

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.

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:

[code]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();
}

}[/code]

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

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!

[code]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();[/code]