我正在尝试制作一个从 TCP 套接字获取数据的 GUI 程序。 问题是当我设置套接字然后启动它时,GUI 程序卡住。 我想添加一个通过使用单击事件来停止线程的函数。
据我所知我必须使用 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(); } } }
socket接收
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; }
}
最佳答案
info = new getInfo(40000);//open socket
info.run();
在上面的行中,您没有启动一个线程,相反,您只是在同一线程中执行run()
方法(就像任何其他方法调用一样)。
从Thread
扩展,然后调用info.start()
。
请参阅:Java 谜题:陷阱、陷阱和极端情况,作者:Joshua Bloch 和 Neal Gafter,Puzzle #76 .
关于java GUI 多线程与套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29530127/