Witam,
aktualnie próbuję napisać komunikator tekstowy w stylu chatu. problem jest w tym, że nowy wątek który ma nasłuchiwać odpowiedzi serwera i wysyłać wiadomości zawiesza całą aplikację.
Z góry dzięki za odpowiedź.
Plik: KomunikatorFrame.java
package glowny;
import java.awt.BorderLayout;
public class KomunikatorFrame extends JFrame {
private static final long serialVersionUID = 7055360075085702038L;
private JPanel contentPane;
private JTextField textField;
private static final String HOST = "192.168.100.15";
private static final int PORT = 8189;
private JTextPane wiadomosci;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
KomunikatorFrame frame = new KomunikatorFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public KomunikatorFrame() {
inicjalizujMenu();
}
public void updateText(String line) {
wiadomosci.setText(line);
}
private void polaczZKanalem(int i) {
WatekKlienta watekKlienta = new WatekKlienta(HOST, PORT);
watekKlienta.setListener(this);
Thread thread = new Thread(watekKlienta);
thread.run();
}
private void inicjalizujMenu() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 640, 480);
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu mnNewMenu = new JMenu("File");
menuBar.add(mnNewMenu);
JMenu mnNewMenu_1 = new JMenu("Connect");
mnNewMenu.add(mnNewMenu_1);
JMenuItem mntmKanal = new JMenuItem("Kanal_01");
mntmKanal.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
polaczZKanalem(1);
}
});
mnNewMenu_1.add(mntmKanal);
JMenuItem mntmExit = new JMenuItem("Exit");
mntmExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
mnNewMenu.add(mntmExit);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout(0, 0));
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.SOUTH);
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
textField = new JTextField();
panel.add(textField);
textField.setColumns(40);
JButton wyslij = new JButton("Wyslij");
panel.add(wyslij);
JSplitPane splitPane = new JSplitPane();
splitPane.setDividerLocation(480);
splitPane.setDividerSize(5);
contentPane.add(splitPane, BorderLayout.CENTER);
wiadomosci = new JTextPane();
wiadomosci.setEditable(false);
splitPane.setLeftComponent(wiadomosci);
JTextPane osoby = new JTextPane();
osoby.setEditable(false);
splitPane.setRightComponent(osoby);
}
}
Plik: WatekKlienta.java
package glowny;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class WatekKlienta implements Runnable {
private KomunikatorFrame komunikatorFrame;
private Scanner in;
private PrintWriter writer;
private String host;
private int port;
private boolean exit;
WatekKlienta(String host, int port) {
this.host = host;
this.port = port;
exit = false;
}
public void setListener(KomunikatorFrame komunikatorFrame) {
this.komunikatorFrame = komunikatorFrame;
}
@Override
public void run() {
while (!exit) {
}
}
}
PS: W pętli while próbowałem nasłuchiwać, usypiać wątek ale powodowało to tylko zmianę użycia procesora z 25% do 1% itd. Całe menu stworzone w swingu i tak było zawieszone.