Note that there are some explanatory texts on larger screens.

plurals
  1. POStarting a thread in a Swing event
    primarykey
    data
    text
    <p>I'm working on the client side application of the client/server chat I'm doing for learning experience. My problem is I can't seem to get the socket and swing,both to run at the same time. </p> <p>What I want to is, when the user opens a JOpionsPane and enters the hostname and port number, clicks okay, then they are connected. When the socket information was hardcoded it worked fine, but now I'm trying to get the users input for it. </p> <p>What's meant to happen is, action listener is supposed to create the new SocketManager object that handles communication. Event though it says it's connected, it doesn't run. When I create the new SocketManager object and run it on a new thread it connects and revives messages form the server, but then the swings freezes and I have to end the process to shut it down. </p> <p>Should I start it on a new worker thread or something? Maybe it's just because I'm tired, but I'm out of ideas. </p> <p><strong>EDIT</strong> I updated my ActLis.class and SocketManager.class with the suggestion of adding a new thread for my SocketManager object 'network'. When I try and use 'network' though it returns null for some reason.</p> <p><em><strong>ActLis.clss</em></strong></p> <pre><code>package com.client.core; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; public class ActLis implements ActionListener { private Main main = new Main();; private JTextField ipadress = new JTextField(), portnumber = new JTextField(), actionField; private String username; final JComponent[] ipinp = new JComponent[]{new JLabel("Enter Hostname (IP Adress): "), ipadress, new JLabel("Enter Port number: "), portnumber}; private SocketManager network; private Window win; public ActLis(){ } public ActLis(JTextField t, Window w){ actionField = t; win = w; } @Override public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if(cmd == "Exit"){ System.exit(0); } else if(cmd == "Connect to IP"){ try{ JOptionPane.showMessageDialog(null, ipinp, "Connect to IP", JOptionPane.PLAIN_MESSAGE); if(network != null){ network.close(); } network = new SocketManager(ipadress.getText(),Integer.parseInt(portnumber.getText())); network.setGUI(win); Thread t = new Thread(network); t.start(); JOptionPane.showMessageDialog(null, "Connected to chat host successfully!","Connected", JOptionPane.INFORMATION_MESSAGE); }catch(Exception ee){ JOptionPane.showMessageDialog(null, "Could not connect. Check IP adress or internet connection","Error - Could not connect", JOptionPane.ERROR_MESSAGE); ee.printStackTrace(); } } else if (cmd == "chatWriter"){ if( actionField.getText() != ""){ try{ network.send(actionField.getText()); win.updateChat(actionField.getText()); actionField.setText(""); actionField.requestFocus(); }catch(Exception ex){ JOptionPane.showMessageDialog(null, "You are not connected to a host. (File -&gt; Connect to IP)","Error - Not Connected", JOptionPane.ERROR_MESSAGE); ex.printStackTrace(); } } } else if (cmd == "setUsername"){ username = actionField.getText(); network.send("USERNAME:" + username); } } } </code></pre> <p><em><strong>Main.class</em></strong></p> <pre><code>package com.client.core; import javax.swing.JFrame; public class Main extends JFrame{ private SocketManager network; public static void main(String[] args){ Main main = new Main(); main.run(); } private void run(){ Window win = new Window(); win.setVisible(true); } } </code></pre> <p><em><strong>SocketManager.class</em></strong></p> <pre><code>package com.client.core; import java.io.*; import java.net.*; public class SocketManager implements Runnable { private Socket sock; private PrintWriter output; private BufferedReader input; private String hostname; private int portnumber; private String message; private Window gui; public SocketManager(String ip, int port){ try{ hostname = ip; portnumber = port; }catch(Exception e){ System.out.println("Client: Socket failed to connect."); } } public synchronized void send(String data){ try{ //System.out.println("Attempting to send: " + data); output.println(data); output.flush(); //System.out.println("Message sent."); }catch(Exception e){ System.out.println("Message could not send."); } } public synchronized void setGUI(Window w){ gui = w; } public synchronized void connect(){ try{ sock = new Socket(hostname,portnumber); }catch(Exception e){ } } public synchronized Socket getSocket(){ return sock; } public synchronized void setSocket(SocketManager s){ sock = s.getSocket(); } public synchronized void close(){ try{ sock.close(); }catch(Exception e){ System.out.println("Could not close connection."); } output = null; input = null; System.gc(); } public synchronized boolean isConnected(){ return (sock == null) ? false : (sock.isConnected() &amp;&amp; !sock.isClosed()); } public synchronized void listenStream(){ try { while((message = input.readLine()) != null){ System.out.println("Server: " + message); gui.updateChat(message); } } catch (Exception e) { } } @Override public void run() { try { sock = new Socket(hostname,portnumber); output = new PrintWriter(sock.getOutputStream(),true); input = new BufferedReader( new InputStreamReader(sock.getInputStream())); while(true){ listenStream(); } } catch (Exception e) { System.out.println("Run method fail. -&gt; SocketManager.run()"); }finally{ try { sock.close(); } catch (Exception e) { } } } } </code></pre> <p><em><strong>Window.class</em></strong></p> <pre><code>package com.client.core; import java.awt.*; import javax.swing.*; public class Window extends JFrame{ private int screenWidth = 800; private int screenHeight = 600; private SocketManager network; private JPanel window = new JPanel(new BorderLayout()), center = new JPanel(new BorderLayout()), right = new JPanel(new BorderLayout()), display = new JPanel( new BorderLayout()), chat = new JPanel(), users = new JPanel(new BorderLayout()); private JTextArea chatBox = new JTextArea("Welcome to the chat!", 7,50), listOfUsers = new JTextArea("None Online"); private JTextField chatWrite = new JTextField(), userSearch = new JTextField(10), username = new JTextField(); private JScrollPane userList = new JScrollPane(listOfUsers), currentChat = new JScrollPane(chatBox); private JMenuBar menu = new JMenuBar(); private JMenu file = new JMenu("File"); private JMenuItem exit = new JMenuItem("Exit"), ipconnect = new JMenuItem("Connect to IP"); private JComponent[] login = new JComponent[]{new JLabel("Username:"), username}; public Window(){ //Initial Setup super("NAMEHERE - Chat Client Alpha v0.0.1"); setResizable(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(screenWidth,screenHeight); //Panels listOfUsers.setLineWrap(true); listOfUsers.setEditable(false); display.setBackground(Color.black); chat.setLayout(new BoxLayout(chat, BoxLayout.Y_AXIS)); chat.setBackground(Color.blue); users.setBackground(Color.green); //TextFields addChatArea(); //Menu bar addMenuBar(); //Adding the main panels. addPanels(); //Listeners addListeners(); for(int x = 0; x &lt; 1; x++){ login(); } } private void login(){ JOptionPane.showMessageDialog(null, login, "Log in", JOptionPane.PLAIN_MESSAGE); } private void addChatArea(){ chatBox.setEditable(false); userList.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); currentChat.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); users.add(userList); users.add(userSearch, BorderLayout.NORTH); chat.add(currentChat); chat.add(chatWrite); chat.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); } private void addMenuBar(){ file.add(ipconnect); file.add(exit); menu.add(file); } private void addPanels(){ right.add(users); center.add(display, BorderLayout.CENTER); center.add(chat, BorderLayout.SOUTH); window.add(center, BorderLayout.CENTER); window.add(right, BorderLayout.EAST); window.add(menu, BorderLayout.NORTH); add(window); } private void addListeners(){ username.addActionListener(new ActLis(username, this)); chatWrite.addActionListener(new ActLis(chatWrite, this)); username.setActionCommand("setUsername"); chatWrite.setActionCommand("chatWriter"); ipconnect.addActionListener(new ActLis()); exit.addActionListener(new ActLis()); } public void setNetwork(SocketManager n){ network = n; } public void updateChat(String s){ chatBox.setText(chatBox.getText() + "\n" + s); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload