1
I have the following code however when I run the Server and client and try to send messages from the client (Frame window) of me error! Can anyone help me? The error is supposed to be the class Panel messages in the Submit button in actionlistener
public class PainelMensagens extends JPanel{
private static final long serialVersionUID = 1L;
private EstadoMensagem estadoMensagem = null;
private JButton botaoEnviar;
private JTextField zonaEscreverMensagens;
private JTextArea zonaReceberMensagens;
private JanelaUtilizador janelaUtilizador;
private Mensagem mensagem;
private SocketCliente socketCliente;
public PainelMensagens(JanelaUtilizador janelaUtilizador) {
this.janelaUtilizador = janelaUtilizador;
setLayout(new BorderLayout());
criarPainelEscrita();
criarPainelLeitura();
}
private void criarPainelEscrita(){
JPanel painelEscrita = new JPanel();
painelEscrita.setLayout(new BorderLayout());
zonaEscreverMensagens = new JTextField();
botaoEnviar = new JButton("Enviar");
botaoEnviar.addActionListener(e->{
String texto = this.zonaEscreverMensagens.getText();
String nome = this.mensagem.getNome();
if(!texto.isEmpty()){
this.mensagem = new Mensagem();
this.mensagem.setNome(nome);
this.mensagem.setMensagem(texto);
this.mensagem.setAccao(Accao.ENVIAR_TODOS);
this.socketCliente.enviar(this.mensagem);
}
this.zonaEscreverMensagens.setText("");
});
painelEscrita.add(zonaEscreverMensagens, BorderLayout.CENTER);
painelEscrita.add(botaoEnviar, BorderLayout.EAST);
add(painelEscrita, BorderLayout.SOUTH);
}
private void criarPainelLeitura(){
zonaReceberMensagens = new JTextArea();
zonaReceberMensagens.setEditable(false);
add(zonaReceberMensagens, BorderLayout.CENTER);
}
public EstadoMensagem getEstadoMensagem() {
return estadoMensagem;
}
public JTextField getZonaEscreverMensagens() {
return zonaEscreverMensagens;
}
public JTextArea getZonaReceberMensagens() {
return zonaReceberMensagens;
}
public JanelaUtilizador getJanelaUtilizador() {
return janelaUtilizador;
}
public JButton getBotaoEnviar() {
return botaoEnviar;
}
}
public class PainelEstadoContacto extends JPanel{
private static final long serialVersionUID = 1L;
private JanelaUtilizador janelaUtilizador;
private JButton botaoOnline;
private JButton botaoOffline;
private JTextField nomeUtilizador;
private Socket socket;
private Mensagem mensagem;
private SocketCliente socketCliente;
public PainelEstadoContacto(JanelaUtilizador janelaUtilizador) {
this.janelaUtilizador=janelaUtilizador;
botaoOnline= new JButton("ONLINE");
botaoOnline.addActionListener(e -> {
String nome = nomeUtilizador.getText();
if(!nome.isEmpty()){
this.mensagem = new Mensagem();
this.mensagem.setAccao(Accao.ONLINE);
this.mensagem.setNome(nome);
this.socketCliente = new SocketCliente();
this.socket = this.socketCliente.conectar();
//Criar thread para iniciar processo
new Thread(new ListenerSocket(this.socket)).start();
}
this.socketCliente.enviar(mensagem);
});
botaoOffline=new JButton("OFFLINE");
botaoOffline.addActionListener(e->{
this.mensagem.setAccao(Accao.OFFLINE);
this.socketCliente.enviar(this.mensagem);
desconectar(mensagem);
});
setLayout(new GridLayout(1,3));
JPanel painel = new JPanel();
painel.setLayout(new BorderLayout());
JLabel utilizador = new JLabel("Utilizador:");
nomeUtilizador = new JTextField();
painel.add(utilizador, BorderLayout.NORTH);
painel.add(nomeUtilizador, BorderLayout.SOUTH);
add(painel);
add(botaoOnline);
add(botaoOffline);
}
public JanelaUtilizador getJanelaUtilizador() {
return janelaUtilizador;
}
private class ListenerSocket implements Runnable {
private ObjectInputStream input ;
public ListenerSocket(Socket socket) {
try {
this.input = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
Mensagem mensagem = null;
try {
while((mensagem = (Mensagem) input.readObject()) != null){
Accao accao = mensagem.getAccao(); //receber accao por parte do servidor
if(accao.equals(accao.ONLINE)){
conectado(mensagem);
}else if(accao.equals(accao.OFFLINE)){
desconectar(mensagem);
socket.close();
}else if(accao.equals(accao.ENVIAR_UM)){
receberMensagem(mensagem);
}else if(accao.equals(accao.CONTACTOS_ONLINE)){
atualizarLista(mensagem);
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void conectado(Mensagem mensagem){
if(mensagem.getMensagem().equals("Não conectado!")){
this.nomeUtilizador.setText("");
JOptionPane.showMessageDialog(this, "Conexão sem sucesso \n Introduzir outro nome");
return ;
}
this.mensagem = mensagem;
// this.botaoOnline.setEnabled(false);
// this.nomeUtilizador.setEditable(false);
//
// this.botaoOffline.setEnabled(true);
//
// //this.textoEnviado.setEditable(true);
// this.janelaUtilizador.getPainelMensagens().getZonaEscreverMensagens().setEditable(true);
//
// //this.botaoEnviar.setEnabled(true);
// this.janelaUtilizador.getPainelMensagens().getBotaoEnviar().setEnabled(true);
// //this.botaoAtualizarLista.setEnabled(true);
// this.janelaUtilizador.getPainelMensagens()
//this.textoRecebido.append(mensagem.getNome() + "\n");
this.janelaUtilizador.getPainelMensagens().getZonaReceberMensagens().append(mensagem.getNome() + "\n");
JOptionPane.showMessageDialog(this, "Conectado ao QuequeAPP");
}
private void desconectar(Mensagem mensagem){
this.botaoOnline.setEnabled(true);
this.nomeUtilizador.setEditable(true);
this.botaoOffline.setEnabled(false);
// this.textoEnviado.setEditable(false);
// this.botaoEnviar.setEnabled(false);
// this.botaoApagar.setEnabled(false);
// this.botaoAtualizarLista.setEnabled(false);
JOptionPane.showMessageDialog(this, "OFFLINE");
}
private void receberMensagem(Mensagem mensagem){
// this.textoRecebido.append(mensagem.getNome() + " diz:" + mensagem.getMensagem() + "\n");
this.janelaUtilizador.getPainelMensagens().getZonaReceberMensagens().append(mensagem.getNome() + " diz: " + mensagem.getMensagem() + "\n");
}
private void atualizarLista(Mensagem mensagem) {
}
}
public class JanelaUtilizador {
private PainelContactos painelContactos;
private PainelMensagens painelMensagens;
private PainelEstadoContacto painelEstadoContacto;
private JFrame janela;
private Cliente cliente;
public JanelaUtilizador(Cliente cliente){
this.cliente = cliente;
painelContactos = new PainelContactos(this);
painelMensagens = new PainelMensagens(this);
painelEstadoContacto = new PainelEstadoContacto(this);
criarJanela();
janela.validate();
janela.setVisible(true);
}
public void criarJanela(){
janela = new JFrame("QuequeApp");
janela.setLayout(new BorderLayout());
janela.setLocation(400,100);
janela.setSize(500, 500);
janela.add(painelContactos, BorderLayout.WEST);
janela.add(painelMensagens, BorderLayout.CENTER);
janela.add(painelEstadoContacto, BorderLayout.NORTH);
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public Cliente getCliente() {
return cliente;
}
public JFrame getJanela() {
return janela;
}
public PainelContactos getPainelContactos() {
return painelContactos;
}
public PainelMensagens getPainelMensagens() {
return painelMensagens;
}
}
Error message
Possible duplicate of Client Server error sending messages
– user28595
Then why did you erase it if it wasn’t duplicate?
– user28595
Only now I realize! Can you help me?
– rrr
You have posted too much code. But I believe that within the class Panelsfiles the private Socketclient socketClient object is null. So when you call it inside your Nviar.addActionListener boot gives the NPE error (Null Pointer Exception).
– cantoni
So what value do you have to assume? You know?
– rrr
It does not have to take value. It has to be instantiated somewhere, according to its logic. Something like this.socketClient = new Socketclient(). Exactly as you do with the message field.
– cantoni