0

下午好!NullPointerException 在另一个搜索屏幕中选择所需记录后,当我尝试将数据加载到注册屏幕时遇到问题。我的代码。:搜索屏幕:

public int retornaSelecao() {
    return (int) tablePesquisa.getValueAt(tablePesquisa.getSelectedRow(), 0);
}
private void tablePesquisaMouseClicked(java.awt.event.MouseEvent evt){                                           
    if (evt.getClickCount() == 2) {
         CadastroCliente cliente = new CadastroCliente(this.retornaSelecao());
         this.dispose();
    }
}        

这个屏幕我得到了记录的 idJTable并调用屏幕寄存器作为传递 id 参数

现在是注册屏幕

public CadastroCliente() {
    initComponents();
    this.desabilitaCampos();
    btnAlterar.setEnabled(false);
    btnExcluir.setEnabled(false);
    btnCancelar.setEnabled(false);
    btnSalvar.setEnabled(false);
    btnNovo.setEnabled(true);
    btnPesquisa.setEnabled(true);
    btnSair.setEnabled(true);    
}

public CadastroCliente(int codigo){
    String sql = "SELECT * FROM CLIENTE WHERE CODIGO = " + codigo;
    Conexao conexao = new Conexao();
    ResultSet rst;
    //System.out.println("" + codigo);
    try {
        pstm = conexao.conectar().prepareStatement("SELECT * FROM CLIENTE WHERE CODIGO = '" + codigo + "';");
        rst = pstm.executeQuery();
        while (rst.next()) {
            txtCodigo.setText("" + rst.getString("codigo"));
            System.out.println("" + rst.getString("codigo"));
            txtDataCadastro.setText(rst.getDate("datacadastro").toString());
            txtDataNascimento.setDate(rst.getDate("datanascimento"));
            txtNome.setText(rst.getString("nome").toUpperCase());
            txtApelido.setText(rst.getString("apelido").toUpperCase());
            txtEndereco.setText(rst.getString("endereco").toUpperCase());
            txtNumero.setText(rst.getString("numero"));
            txtComplemento.setText(rst.getString("complemento").toUpperCase());
            txtBairro.setText(rst.getString("bairro").toUpperCase());
            txtCep.setText(rst.getString("cep"));
            txtNomeCidade.setText(rst.getString("cidade").toUpperCase());
            txtRg.setText(rst.getString("rg"));
            txtCpf.setText(rst.getString("cpf"));
            cbPagamento.setSelectedItem(rst.getInt("diapagamento"));
            txtMensalidade.setText("" + rst.getFloat("mensalidade"));
            txtTelefoneResidencial.setText(rst.getString("telres"));
            txtTelefoneComercial.setText(rst.getString("telcom"));
            txtTelefoneCelular.setText(rst.getString("celular"));
            txtInformacoes.setText(rst.getString("informacoes"));
        }
    } catch (SQLException ex) {
        Logger.getLogger(CadastroCliente.class.getName()).log(Level.SEVERE, null, ex);
    }
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new CadastroCliente().setVisible(true);
        }
    });
}

我创建了两个构造函数NullPointerException,在第一个完成后给予更多的JTextField. 为什么给出这个错误?谁能帮我?谢谢你

4

1 回答 1

2

这将有助于发布堆栈跟踪和发生错误的行。

但是通过查看 2 个构造函数:

public CadastroCliente() {
    initComponents();
    this.desabilitaCampos();
    btnAlterar.setEnabled(false);
    btnExcluir.setEnabled(false);
    btnCancelar.setEnabled(false);
    btnSalvar.setEnabled(false);
    btnNovo.setEnabled(true);
    btnPesquisa.setEnabled(true);
    btnSair.setEnabled(true);
}

public CadastroCliente(int codigo){
    String sql = "SELECT * FROM CLIENTE WHERE CODIGO = " + codigo;
    Conexao conexao = new Conexao();
    ResultSet rst;
    ...
}

initComponents()您不会像在构造函数中那样调用CadastroCliente(int codigo)最有可能初始化您的 GUI(以及大多数JTextField等)的方法。

它应该是:

public CadastroCliente(int codigo){
    initComponents();//initialize components
     //if the buttons need to be set do that here
    String sql = "SELECT * FROM CLIENTE WHERE CODIGO = " + codigo;
    Conexao conexao = new Conexao();
    ResultSet rst;
    ...
}

更新:

此外,您不希望在 GUI 事件调度线程上执行长时间运行的任务,例如数据库查询,因为这可能会导致 UI冻结并且仅在任务完成后才变为活动状态,因此不会显示中间结果:

ResultSet rst;
//System.out.println("" + codigo);
try {
    pstm = conexao.conectar().prepareStatement("SELECT * FROM CLIENTE WHERE CODIGO = '" + codigo + "';");
    rst = pstm.executeQuery();
    while (rst.next()) {
        txtCodigo.setText("" + rst.getString("codigo"));//wont show until the while loop is done
        ...
    }
} catch (SQLException ex) {
    Logger.getLogger(CadastroCliente.class.getName()).log(Level.SEVERE, null, ex);
}

最好也将这项工作交给Swing Worker并使用它的publish(..)方法来获得中间结果。

根据甲骨文

SwingWorker 提供了许多通信和控制功能:

  • SwingWorker 子类可以定义一个方法 done,当后台任务完成时,该方法会在事件调度线程上自动调用。

  • SwingWorker 实现 java.util.concurrent.Future。该接口允许后台任务向其他线程提供返回值。此接口中的其他方法允许取消后台任务并发现后台任务是否已完成或已取消。

  • 后台任务可以通过调用 SwingWorker.publish 来提供中间结果,从而从事件调度线程调用 SwingWorker.process。

  • 后台任务可以定义绑定属性。对这些属性的更改会触发事件,从而在事件调度线程上调用事件处理方法。

还可以阅读Swing 中的并发

于 2013-02-16T19:13:00.230 回答