我正在尝试创建一个从TCP套接字获取数据的GUI程序。 问题是当我设置套接字,然后启动它,GUI程序冻结。 我想通过使用click事件添加一个停止线程的函数。
据我所知,我必须使用EDT,但我尝试过但不起作用。有没有人可以帮助我?
这是我的代码。
主
public class ImageSplit {
static ImageViewerFrame program;
public static void main(String[] args) throws IOException {
JPanel[] displayArray = new JPanel[100];
program = new ImageViewerFrame();
EventQueue.invokeLater(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
program.setVisible(true);
}
});
}
框
void createMouseMenu() {
final PopupMenu menu = new PopupMenu();
MenuItem grid = new MenuItem("Grid");
MenuItem start = new MenuItem("Start");
MenuItem stop = new MenuItem("Stop");
menu.add(grid);
menu.add(start);
menu.add(stop);
add(menu);
mouseMenuHandler mousemenu = new mouseMenuHandler();
grid.addActionListener(mousemenu);
start.addActionListener(mousemenu);
stop.addActionListener(mousemenu);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (e.getModifiers() == InputEvent.BUTTON3_MASK)
menu.show(e.getComponent(), e.getX(), e.getY());
}
});
}
class mouseMenuHandler implements ActionListener {
getInfo info;
public void actionPerformed(ActionEvent e) {// open grid setting
if (e.getActionCommand().equals("Grid")) {
gridSettingUI = new GridSetting(img);
gridSettingUI.setVisible(true);
} else if (e.getActionCommand().equals("Start")) {
try {
info = new getInfo(40000);//open socket
info.run();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else if (e.getActionCommand().equals("Stop")) {
System.out.println("stop");
info.stop();
}
}
}
套接字
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class getInfo implements Runnable{
ServerSocket serverSocket;
private boolean stopped=false;
public getInfo(int port_num) throws IOException{
serverSocket = new ServerSocket(port_num);
}
@Override
public void run() {
// TODO Auto-generated method stub
while(!stopped){
try {
Socket socket = serverSocket.accept();
System.out.println(socket.getInetAddress()+ "connected");
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
if(br.ready())
{
String line = br.readLine();
System.out.println(line+"\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void stop(){
stopped = true;
}
}
答案 0 :(得分:0)
info = new getInfo(40000);//open socket
info.run();
在上面的行中,你是 NOT 启动一个线程,而你只是在同一个线程中执行run()
方法(就像任何其他方法调用一样)。 / p>
从Thread
延伸,然后致电info.start()
。
请参阅: Java Puzzlers:陷阱,陷阱和角落案例作者:Joshua Bloch和Neal Gafter,Puzzle #76。
答案 1 :(得分:0)
我写了一个名为Jexxus的库,它可以让你更容易地使用套接字。它将自动在不同的线程上执行操作,因此您的UI不会冻结。页面底部有一个小教程:https://github.com/mirraj2/Jexxus/tree/master