2015-12-14 4 views
0

У меня есть основной класс с двумя подклассами, один для инициализации GUI и один для создания и функциональности сервера. У меня есть логическая переменная «connected», которая истинна, когда пользователь подключен к серверу, а false - нет. Как я могу обновить текст JTextPane в подклассе GUI из подкласса сервера, чтобы сказать, что «клиент подключен», когда «подключен» является истинным, а «нет соединения» при ложном?Изменение текста JTextPane при изменении логической переменной

главный класс:

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"); 
      } 

     } 

    } 

} 

графический интерфейс класса (несущественные части удалены):

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 

    } 
} 

серверного класса (несущественные части удалены):

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

'если (подключен) {label.setText ("Connected"); } else {label.setText («Клиент не подключен») 'возможно (?) – Frakcool

+1

В чем проблема? Доступ к экземпляру JTextPane? Настройка текста в нужное время? Добавление в JTextPane? Пожалуйста, будьте более конкретными, иначе мы можем просто догадаться. В идеале, пожалуйста, также покажите, что вы пробовали в [mcve]. –

+0

Model-View-Controller – ControlAltDel

ответ

0

Вы могли бы создать своего рода прослушиватель, используя интерфейс java, где реализация метода слушателя записывается в ваш подкласс.

public interface ResultListener { 
    public void setResult(boolean result); 
} 

Тогда единственное, что вам нужно, это передать этот интерфейс как параметр, в котором вы инициализируете сервер и вызываете метод слушателя.

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 

    } 

} 

И наконец:

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 ответ обновлен! –

+0

Не забывайте, что Swing не является потокобезопасным, и любые обновления пользовательского интерфейса ДОЛЖНЫ быть сделаны из контекста Event Dispatching Thread – MadProgrammer