按钮操作后 JavaFx 阶段没有响应

JavaFx stage not responding after action on button

下面class是启动一个UDP监听:

public class Client extends Application {

UdpListener udp = new UdpListener();

public static void main(String[] args) {

    Application.launch();
}

@Override
public void start(Stage stage) {

    HBox root = new HBox();
    Button startListeningButton = new Button("START LISTEN");
    Button stopListeningButton = new Button("STOP LISTEN");
    Scene scene = new Scene(root);
    root.setSpacing(10);
    root.getChildren().addAll(startListeningButton, stopListeningButton);

    EventHandler<MouseEvent> handlerStartListen = event -> {

        try {
            udp.run();
        }catch (Exception e) {
            e.printStackTrace();
        }
    };

    EventHandler<MouseEvent> handlerStopListen = event -> {
        //
    };

    startListeningButton.addEventFilter(MOUSE_CLICKED, handlerStartListen);
    stopListeningButton.addEventFilter(MOUSE_CLICKED, handlerStopListen);

    stage.setScene(scene);
    stage.setTitle("SNIFFER");
    stage.show();
    stage.sizeToScene();

}

低于UdpListener

public class UdpListener implements Runnable {

    private final Integer LIST_PORT = 30000;
    private final Integer UDP_SIZE = 1472;

    private DatagramSocket socket;
    private DatagramPacket receivingPacket;


    public void run() {
        try {

            socket = new DatagramSocket(LIST_PORT);
            doProcessing();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void doProcessing() throws IOException {


        while (true) {

            String checkAsterix;
            String asterixPackData;
            byte buff[] = new byte[UDP_SIZE];

            receivingPacket = new DatagramPacket(buff, buff.length);

            socket.receive(receivingPacket);
            buff = receivingPacket.getData();

            asterixPackData = new Decode(buff).getHexString();
            checkAsterix = asterixPackData.substring(0, Math.min(asterixPackData.length(), 2));

            Integer i = Integer.decode("0x" + checkAsterix);

            switch (i) {

                case (48):
                    new ShowMessage("TROVATO");
                    //new atxlib....
                    break;

                default:
                    new ShowMessage("SCARTO");
                    break;
            }
        }
    }
}

UdpListener 是另一个 class,它只是打开一个套接字以嗅探所有数据到端口 XXXX 并对其进行解码。

我可以直接启动UdpListener但是,如果我 link 从上面的代码开始,应用程序看起来像卡住了,即使它在工作

当我在舞台上移动鼠标光标时,它变为"loading"。 同时 activity 监视器显示 "java not responding".

有什么建议吗?

您正在使用无限循环阻塞 UI 线程。如果这样做,UI 将停止响应。您需要 运行 从另一个线程 运行 这么长的时间:

替换

try {
    udp.run();
}catch (Exception e) {
    e.printStackTrace();
}

new Thread(udp).start();

并在必要时使用 Platform.runLater 从新线程更新 ui。