NullPointerException ao tentar acessar JFrame já instanciado (swing)

4 respostas
geyson_santana

Galera, estou com um problema que não achei a solução ainda. Me parece simples mas não achei uma saída. Tenho um projeto com vários JFrames. Um desses JFrames chamado InitialProtocol, abre outro JFrame chamado ViewIndexerInitialProtocol, quando é selecionado o arquivo e clicado em um botão. Quero que ao fechar este último JFrame, ele envie o parâmetro para habilitar um textField inicialmente desabilitado da tela InitialProtocol. Só que aí que está o problema. Eu consigo setar parâmetros a partir da JFrame InitialProtocol, mas quando tento fazer o inverso, é como se a tela não tivesse instanciada e dá NullPointerException…

Essa é a parte importante da classe InitialProtocol no qual chama a ViewIndexerInitialProtocol:

package sysdochu.telas;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.File;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.filechooser.FileNameExtensionFilter;

/**
*

  • @author GeysonPereira
    */
    public class InitialProtocol extends javax.swing.JFrame {
private String pathFilePDF;
private ViewIndexerInitialProtocol viewIndexerInitialProtocol;
private Boolean signalCloseViewIndexerInitialProtocol;
private FirstWindow firstWindow;
/**
 * Creates new form InitialProtocol
 */
public InitialProtocol() {
    initComponents();
    setLocationView();
    openIndexerPage();
    closePage();
}
private void openIndexerPage() {
    pathFileInitialProtocol.setEnabled(true);
    pathFileInitialProtocol.setText("");
    cleanTextLogInitialProtocol();
}
private void cleanStates() {
    pathFilePDF = "";
    pathFileInitialProtocol.setEnabled(true);
    pathFileInitialProtocol.setText("");
    cleanTextLogInitialProtocol();
}
private void setLocationView() {
    setLocationCenterView();
}
private void closePage() {
    addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent evt) {
            if (JOptionPane.showConfirmDialog(null, "Deseja realmente sair?") == JOptionPane.OK_OPTION) {
                cleanStates();
                dispose();
            }
        }
    });
}
private void setLocationCenterView() {
    setLocationRelativeTo(null);
}
public void textLogInitialProtocol(String log) {
    textLogInitialProtocol.append(log + "\r\n");
}
private void cleanTextLogInitialProtocol() {
    textLogInitialProtocol.setText("");
}
private void openViewerIndexerInitialProtocol() {
    signalCloseViewIndexerInitialProtocol = false;
    if (pathFileInitialProtocol.getText().isEmpty()) {
        textLogInitialProtocol("Selecione um arquivo para indexar.");
        JOptionPane.showMessageDialog(rootPane, "Nenhum arquivo não foi selecionado.");
    } else if (!pathFileInitialProtocol.getText().endsWith(".pdf")) {
        textLogInitialProtocol("O documento selecionado não parece ser um PDF válido. Selecione o arquivo novamente.");
        JOptionPane.showMessageDialog(rootPane, "O documento selecionado não parece ser um PDF válido. Selecione o arquivo novamente.");
    } else {            
        if (viewIndexerInitialProtocol == null) {
            pathFileInitialProtocol.setEnabled(false);
            viewIndexerInitialProtocol = new ViewIndexerInitialProtocol();
            viewIndexerInitialProtocol.setVisible(true);
            viewIndexerInitialProtocol.setExtendedState(MAXIMIZED_BOTH);
            viewIndexerInitialProtocol.setStringPDF(pathFilePDF);
            System.out.println("Nulo\n");
            } else {
            pathFileInitialProtocol.setEnabled(false);
            viewIndexerInitialProtocol.setVisible(true);
            viewIndexerInitialProtocol.setState(JFrame.NORMAL);
            viewIndexerInitialProtocol.setExtendedState(MAXIMIZED_BOTH);
            viewIndexerInitialProtocol.setStringPDF(pathFilePDF);
            System.out.println("Não Nulo\n");
        }
    }
}
public void setEnableTextFieldCloseViewIndexer(Boolean text){
    pathFileInitialProtocol.setEnabled(text);
}

Essa é a outra classe…

package sysdochu.telas;

import java.awt.Dimension;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JTextField;

/**
*

  • @author GeysonPereira
    */
    public class ViewIndexerInitialProtocol extends JFrame {
InitialProtocol signalClose;
private String pathToPDF;
private javax.swing.JPanel panelPDF;
javax.swing.JFrame jframe;
/**
 * Creates new form ViewIndexarInitialProtocol
 */
public ViewIndexerInitialProtocol() {
    initComponents();
    createJPanel();
    maximizeView();
    openPDF();
    closePage();
}
private void closePage() {
    addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent evt) {
            if (JOptionPane.showConfirmDialog(null, "Deseja Cancelar? Esses dados serão perdidos.") == JOptionPane.OK_OPTION) {
                sendSignalClose();
                cleanStates();
                excludeJPanel();
                dispose();
            }
        }
    });
}
private void sendSignalClose(){
    signalClose.setEnableTextFieldCloseViewIndexer(true);
}

Quem puder ajudar, agradeço.

4 Respostas

Chaybelucas

Cara
Eu não tenho solução
Mas digo logo três coisas

  1. Muda pra JavaFX
  2. Como imagino que realmente precise de Swing por algum motivo, tente mudar o valor de alguma variável. Quando retornar para a tela, verifica se a variavel é true ou false, por exemplo. Se for True habilita o campo
  3. Se nenhuma das duas opções for viável, então trabalha com JInternalFrame. Ele vai, provavelmente, acabar com o nullPointerException

O motivo de dar NullPointerException é que você fez um “círculo” com as informações. Seria como eu te fazer uma pergunta e te responder com a mesma pergunta. Ninguém obtém resposta. Então, usa uma outra variável, ou tenta mudar a tela e tal. JInternalFrame pode ser uma saída. Ou mesmo, uma classe com um método set, pra isso

L

Melhor você postar a exceção por completo, assim podemos ir direto no arquivo e linha de erro…

F

Tenta instanciar o ViewIndexerInitialProtocol antes (new ViewIndexerInitialProtocol())
Torne esse objeto static e veja o que acontece.

geyson_santana

Obrigado pela resposta de todos, mas resolvi com algo bem simples. Minha tela primária que abre a tela secundária vai passar o parâmetro da própria tela. Para isso, criei um método na tela secundária para recebê-lo:

public void receiveJFrameInitialProtocol(InitialProtocol frame) {

this.signalClose = frame;

}
Na tela de envio, fica assim:

public void sendJFrameThis() {

viewIndexerInitialProtocol.receiveJFrameInitialProtocol(this); //E aqui é repassado a instância.

}

Funcionou perfeito. Espero que ajude alguém. Peace.

Criado 29 de abril de 2017
Ultima resposta 2 de mai. de 2017
Respostas 4
Participantes 4