我正在试图弄清楚是否可以阻止GUI。基本上,我的应用程序(使用 NetBeans平台和 JavaFX )与服务器建立了连接。
无论用户看到哪个屏幕,如果应用程序失去与服务器的连接,我想阻止所有内容(用户无法打开任何新窗口或点击任何地方),直到应用程序再次连接(它没有'重要的是,如果需要5分钟或5小时)。尽管如此,最重要的是应该出现一条警告信息(总是在顶部)。
正在侦听服务器连接的java类没有对JavaFX容器的任何引用。这就是我实际拥有的东西:
public class StatusConnectionObserver implements ConnectionObserver {
private final Led led;
private final Label label;
public StatusConnectionObserver(Led led, Label label) {
this.led = led;
this.label = label;
}
@Override
public void setConnected(boolean connected) {
if (connected) {
Platform.runLater(() -> {
led.setLedColor(Color.rgb(59, 249, 53));
label.setText("Connected");
});
} else {
Platform.runLater(() -> {
led.setLedColor(Color.RED);
label.setText("Disconnected");
});
}
}
}
和
public class ConnectionComponent {
private Led led;
private Label label;
private HBox container;
private VBox ledContainer;
public ConnectionComponent() {
initGraphics();
}
public Parent getView() {
return this.container;
}
public void initGraphics() {
//Here I set up the elements (label and Led) inside the container
}
这里叫做:
@ServiceProvider(service = StatusLineElementProvider.class)
public class ConnectionIndicator implements StatusLineElementProvider {
@Override
public Component getStatusLineElement() {
JFXPanel fxPanel = new JFXPanel();
Platform.setImplicitExit(false);
new JavaFXUIThread().runOnUiToolkitThread(() -> {
Scene scene = new Scene(new ConnectionComponent().getView());
scene.getStylesheets().add(FXTheme.getDefault().getStylesheet());
fxPanel.setScene(scene);
});
return fxPanel;
}
}
这个想法是在顶部显示一些内容(甚至是简单的文本消息),同时使应用程序在后台更加不透明。
答案 0 :(得分:0)
您需要模态 Dialog
。创建这样的对话框并在连接断开时显示它。然后使用一个Thread定期检查你的连接是否已备份。连接活动的时间会终止对话框。由于对话框是模态的,因此意味着在解析之前,您无法对UI执行任何操作。请参阅this。
答案 1 :(得分:0)
使用Alert
或Dialog
个组件。您可以通过CSS设置样式或添加自定义内容。尝试这个最简单的解决方案:
Alert a = new Alert(Alert.AlertType.ERROR, "Connection error");
public void createAlert() {
a.getDialogPane().getButtonTypes().clear();
a.initModality(Modality.APPLICATION_MODAL);
//*************** EDIT ***************
a.initStyle(StageStyle.UNDECORATED);
a.initOwner(label.getScene().getWindow());
//************************************
}
@Override
public void setConnected(boolean connected) {
if (connected) {
Platform.runLater(() -> {
label.setText("Connected");
a.show();
});
} else {
Platform.runLater(() -> {
label.setText("Disconnected");
a.close();
});
}
}
您还可以在整个Pane
上添加其他Scene
:
StackPane root = new StackPane();
root.getChildren().addAll(applicationContent);
Pane p = new Pane();
p.setStyle("-fx-background-color: rgba(31,31,31,0.6);");
//add Pane to root when disconnected
//root.getChildren().add(p);
Scene scene = new Scene(root, 300, 250);