2015-12-14 4 views
0

J'ai une classe principale avec deux sous-classes, une pour l'initialisation de l'interface graphique et une pour la création et la fonctionnalité du serveur. J'ai une variable booléenne 'connected', ce qui est vrai quand un utilisateur est connecté au serveur et false dans le cas contraire. Comment serais-je capable de mettre à jour le texte d'un JTextPane dans la sous-classe GUI de la sous-classe du serveur pour dire "client connecté" quand "connected" est vrai et "no connection" si false?Modification du texte JTextPane sur une variable booléenne

classe principale:

public class serverMain { 

    public static boolean allowConnections = false; 
    public static boolean connected = false; 
    public static boolean launchOnStart = false; 
    public static boolean loop = true; 

    public static int serverPort = 1234; 
    public static ServerSocket serverSocket; 

    public static void main(String args[]){ 

     serverGUI.gui(); 

     while (loop){ 

      if (allowConnections == true){ 
       serverCommands.commands(); 
      } 
      else { 
       System.out.println("reject"); 
      } 

     } 

    } 

} 

classe IUG (parties non pertinentes enlevés):

public class serverGUI extends serverMain { 

    public static JTextPane txtConnectionMarker; 

    public static void gui(){ 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        serverGUI window = new serverGUI(); 
        window.frmRemoteServer.setVisible(true); 
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public serverGUI() { 
     initialise(); 
    } 

    public void initialise() { 

     frmRemoteServer = new JFrame(); 
     frmRemoteServer.setBounds(100, 100, 720, 420); 
     frmRemoteServer.setResizable(false); 
     frmRemoteServer.setTitle("Remote Server"); 
     frmRemoteServer.getContentPane().setBackground(Color.WHITE); 
     frmRemoteServer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frmRemoteServer.getContentPane().setLayout(null); 

     JTextPane txtConnectionMarker = new JTextPane(); 
     txtConnectionMarker.setEditable(false); 
     txtConnectionMarker.setBounds(548, 21, 149, 33); 
     txtConnectionMarker.setFont(new Font("Segoe UI Light", Font.BOLD, 16)); 
     txtConnectionMarker.setBackground(SystemColor.menu); 
     frmRemoteServer.getContentPane().add(txtConnectionMarker); 

     if (connected == true){ 
      txtConnectionMarker.setText("Connected"); 
      txtConnectionMarker.setForeground(Color.GREEN); 
     } 
     else { 
      txtConnectionMarker.setText("No Connection"); 
      txtConnectionMarker.setForeground(Color.RED); 
     } 

     // obviously this will not update as connected changes 

    } 
} 

classe serveur (parties non pertinentes supprimées):

public class serverCommands extends serverMain { 

    public static void commands() { 

     String input; 

     try { 

      serverSocket = new ServerSocket(serverPort); 
      System.out.println("socket opened on port "+serverPort); 

      Socket clientSocket = serverSocket.accept(); 
      connected = true; 

      // there's more to all parts but the given code 
      // should be enough to get what I'm trying to do 
      // basically once the user disconnects connected 
      // will change back to false 
+1

'si (connecté) {label.setText ("Connected"); } else {label.setText ("Client non connecté)}' peut-être (?) – Frakcool

+1

Quel est exactement le problème? Accéder à l'instance JTextPane? Définir le texte au bon moment? Ajouter au JTextPane? Veuillez être plus précis, sinon Nous pouvons simplement deviner Idéalement s'il vous plaît également montrer ce que vous avez essayé dans un [mcve] –

+0

Model-View-Controller – ControlAltDel

Répondre

0

Vous pouvez créer une sorte de listener utilisant une interface java où l'implémentation de la méthode listener est écrite dans votre sous-classe. Ensuite, la seule chose dont vous avez besoin est de passer cette interface en paramètre où vous initialisez le serveur et appelez la méthode d'écoute.

public class MyServer { 

    private ResultListener listener; 

    public MyServer(ResultListener listener) { 
     this.listener = listener; 
    } 

    public void doSomething() { 

     // other stuff 
     listener.setResult(true); // or false if connected or not 

    } 

} 

Et enfin:

public class MainClass implements ResultListener { 

    public void init() { 
     // your GUI and other logic 

     MyServer server = new MyServer(this); 
     server.doSomething(); 

    } 

    @Override 
    public void setResult(boolean result) { 

     if(result) { 
      // do stuff 
      label.setText("Connected!"); 
     } else { 
      // do other stuff 
      label.setText("Connection failed!"); 
     } 
    } 

} 
+0

@KaiHulme réponse mise à jour! –

+0

N'oubliez pas que la fonction Swing n'est pas compatible avec Thread et que toute mise à jour de l'interface utilisateur DOIT être effectuée dans le contexte du thread de distribution d'événements – MadProgrammer