【发布时间】:2015-04-09 05:00:33
【问题描述】:
我正在尝试制作一个从 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(); } } } -
套接字接收
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; }
}
【问题讨论】:
-
2.框架,我只附上了菜单动作部分。如果您需要完整代码,请告诉我
-
“我知道我必须使用 EDT,我尝试过但没有用。” - 不,这实际上是相反的,你不想在 EDT 中执行长时间运行或阻塞的呼叫(例如与
Socket交谈) -
@MadProgrammer 是的,所以我想通过使用 GUI 事件来停止套接字,但在我的 GUI 上没有任何工作。它完全冻结了
-
那是因为你在 EDT 中打开了 Socket...
-
使用
SwingWorker进行套接字工作。
标签: java multithreading swing sockets