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!