按钮操作后 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。
下面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。