Få signal när JFrame i annat klass är disposed

Trädvy Permalänk
Medlem
Registrerad
Apr 2016

Få signal när JFrame i annat klass är disposed

Hej alla
Jag har en chat applikation
Chat ska bli 1:1 mellan serverklass och clientklass.

Server kan inbjuda clientklass till samtal via knappen "Inbjuda". Eftersom samtalet blir 1:1, knappen Inbjuda blir låst(Enabled false) om klient är inloggat. Det fungerar jättebra.
Min problem är, när klient är loggat ut, det vill säga clientklass JFrame är "disposed", knappen Inbjuda måste bli användbart igen(Enabled true).
Jag har funderat några dagar men jag kunde hitta någon bra lösning.

De är mina koder:
Serverklass

import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.*; public class Chat_Server extends JFrame implements ActionListener { JButton jb1 = new JButton("Inbjuda"); //jbutton för att inbjuda client JButton Name = new JButton("Name"); JButton Enter = new JButton("Enter"); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); JPanel jp3 = new JPanel(); static JTextArea textarea = new JTextArea(25,40); JTextField textfield = new JTextField(35); static ServerSocket SS; static Socket S; static DataInputStream DIS; static DataOutputStream DOS; String name; String Servername; Chat_Client CC; final ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); public Chat_Server(){ jp1.setLayout(new FlowLayout()); jp1.add(jb1);jp1.add(Name); jb1.addActionListener(this); Name.addActionListener(this); jp2.add(textarea); jp3.setLayout(new FlowLayout()); jp3.add(textfield); jp3.add(Enter); Enter.setEnabled(false); add(jp1, BorderLayout.NORTH); add(jp2, BorderLayout.CENTER); add(jp3, BorderLayout.SOUTH); textfield.setText("Klicka på knappen Number och skriv ditt namn först. Texten tas bort automatiskt"); Enter.addActionListener(this); setSize(500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ if(e.getSource()==jb1){ CC= new Chat_Client(); threadExecutor.submit(CC); textarea.setText("Användaren2 har loggat in");//visar att client klass startades jb1.setEnabled(false); } if(e.getSource()==Name){ name = JOptionPane.showInputDialog("Skriv ditt namn"); Servername= name; if((name!=null)&&(!name.isEmpty())){ Enter.setEnabled(true); textfield.setText(""); } if(name.isEmpty()) JOptionPane.showMessageDialog(null,"Måste ange namn!!"); } if(e.getSource()==Enter){ try{ String MessageOut= ""; MessageOut = textfield.getText(); DOS.writeUTF(Servername+": " + MessageOut); }catch( Exception ex){ System.out.println("ERROR!"); ex.getStackTrace(); } } } //Rad 91 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! public static void main (String[] args){ Chat_Server cs = new Chat_Server(); String MessageIn = ""; try{ SS = new ServerSocket(1337); Socket S = SS.accept(); DIS = new DataInputStream(S.getInputStream()); DOS = new DataOutputStream(S.getOutputStream()); while (!MessageIn.equals("Stop the chat")){ MessageIn = DIS.readUTF(); textarea.setText(textarea.getText()+"\n"+MessageIn); } } catch(Exception e){ System.out.println("ERROR!!"); } } }

Clientklass

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Chat_Client extends JFrame implements ActionListener, Runnable{ JButton Name = new JButton("Name"); JButton Enter = new JButton("Enter"); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); JPanel jp3 = new JPanel(); static JTextArea textarea = new JTextArea(25,40); JTextField textfield = new JTextField(35); static ServerSocket SS; static Socket S; static DataInputStream DIS; static DataOutputStream DOS; String name; String Clientname; Chat_Server serv; String MessageOut=""; public Chat_Client(){ jp1.add(Name); Name.addActionListener(this); jp2.add(textarea); jp3.setLayout(new FlowLayout()); jp3.add(textfield); jp3.add(Enter); Enter.setEnabled(false); add(jp1, BorderLayout.NORTH); add(jp2, BorderLayout.CENTER); add(jp3, BorderLayout.SOUTH); Enter.addActionListener(this); // addWindowListener(w); setSize(500,500); setVisible(true); setDefaultCloseOperation(DISPOSE_ON_CLOSE); } /*WindowListener w = new WindowAdapter(){ Rad54 public void WindowClosed(WindowEvent e) throws IOException{ serv.jb1.setEnabled(true); MessageOut = "Användare2 har loggat ut"; DOS.writeUTF(MessageOut); } };*/ public void actionPerformed(ActionEvent e){ if(e.getSource()==Name){ name = JOptionPane.showInputDialog("Skriv ditt namn"); Clientname = name; if((name!=null)&&(!name.isEmpty())){ Enter.setEnabled(true); textfield.setText(""); } if(name.isEmpty()) JOptionPane.showMessageDialog(null,"Måste ange namn!!"); } if(e.getSource()==Enter){ try{ MessageOut = textfield.getText(); DOS.writeUTF(Clientname+": " + MessageOut); }catch( Exception ex){ System.out.println("ERROR!"); } } } @Override public void run() { String MessageIn = ""; try{ S = new Socket("127.0.0.1",1337); DIS = new DataInputStream(S.getInputStream()); DOS = new DataOutputStream(S.getOutputStream()); while (!MessageIn.equals("Stop the chat")){ MessageIn = DIS.readUTF(); textarea.setText(textarea.getText()+"\n" +MessageIn); } } catch(Exception e){ System.out.println("ERROR!!"); } } }

Om ni tittar på raden 54 i Clientklass, ni kan se att jag har försökt att använda WindowListener men ändrades ingenting med resultat. Därför jag tänkte att använda WindowListener i Serverclass efter actionPerformed på raden 91

CC.WindowListener w1...

men de hittar inte package CC
Någon har bra ide? Måste man anropa det windowlyssnare som jag skrev i clientklass ?