我想在我的應用程式的窗格中創建一個 FadeTransition。此外,通過此 FadeTransition,我將窗格內某些 JavaFX 的可見性設定為 false,以使它們消失。它作業正常,但是,當我在 FadeTransition 之后呼叫另一個名為 waitForResponse(event) 的方法時,它就停止作業了。我不知道為什么。如果我評論 waitForResponse(event) FadeTransitions 將再次開始作業。我想可能是waitForResponse(event)里面的Socket和InputStreamReader有問題,但是我測驗了把它取出來,在這個方法里面做另一個基本的東西仍然不起作用。我進行了其他測驗,發現如果我在其后放置任何 bufferedReader、其他回圈或決策結構,FadeTransition 和其他可見性更改將不起作用。
這是代碼:
public class LoadingScreenController implements Initializable {
// Socket que vai ser utilizado nos vários métodos para conversar com o servidor
private Socket cliente;
// PrintWriter que vai ser utilizado pelos vários métodos e vai passar o
// argumento para o switch case
private PrintWriter pr;
private InputStreamReader in;
private BufferedReader bf;
private String option;
private String response;
@FXML
private Button refreshButton;
@FXML
private ImageView loadingGif;
@FXML
private Label txtLabel;
@FXML
private AnchorPane rootPane;
public String getOption() {
return option;
}
public void setOption(String option) {
this.option = option;
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
@FXML
private void makeFadeInTransition() {
FadeTransition fadeTransition = new FadeTransition(Duration.seconds(1), loadingGif);
fadeTransition.setFromValue(0.0);
fadeTransition.setToValue(1.0);
fadeTransition.play();
}
@FXML
private void onRefreshButtonAction(ActionEvent event) {
if (option == null) {
throw new IllegalStateException("Entity was null");
}
refreshButton.setVisible(false);
refreshButton.setDisable(true);
txtLabel.setVisible(false);
makeFadeInTransition();
sendOptionToServer(event);
}
@FXML
private void sendOptionToServer(ActionEvent event) {
try {
cliente = new Socket("localhost", 3322);
pr = new PrintWriter(cliente.getOutputStream());
in = new InputStreamReader(cliente.getInputStream());
bf = new BufferedReader(in);
pr.println(option);
pr.flush();
waitForReponse(event, bf);
} catch (IOException e) {
e.printStackTrace();
}
}
private void waitForReponse(ActionEvent event, BufferedReader bf) throws IOException {
response = bf.readLine();
switch (response) {
case "a":
Utils.currentStage(event).close();
break;
}
}
}
uj5u.com熱心網友回復:
您的sendOptionToServer(...)方法,尤其是您的waitForResponse(...)方法,包含阻止執行的阻塞呼叫,直到它們完成(即,直到您收到來自服務器的回應)。由于您在 FX 應用程式執行緒上運行它們,因此在這些呼叫完成之前,您會阻止該執行緒執行其正常作業。這意味著它不會更新 UI 或處理任何用戶事件,直到您收到并處理來自服務器的回應。
您應該在后臺執行緒中呼叫阻塞方法,以允許 FX 應用程式執行緒在此期間繼續進行。該javafx.concurrentAPI使這相當容易做到; 這里Task應該足夠了。
這是一個使用Task. 我還使用了“嘗試資源”來確保需要關閉的所有內容都正確關閉。
@FXML
private void sendOptionToServer(ActionEvent event) {
Task<String> serverCommunicationTask = new Task<>() {
@Override
protected String call() throws Exception {
try (
Socket cliente = new Socket("localhost", 3322);
PrintWriter pr = new PrintWriter(cliente.getOutputStream());
BufferedReader bf = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
) {
pr.println(option);
pr.flush();
return bf.readLine();
}
}
};
serverCommunicationTask.setOnSucceeded(event -> {
if ("a".equals(serverCommunicationTask.getValue())) {
rootPane.getScene().getWindow().hide();
}
});
serverCommunicationTask.setOnFailed(event -> {
event.getException().printStackTrace();
// handle exception...
});
Thread thread = new Thread(serverCommunicationTask);
thread.setDaemon(true);
thread.start();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/360439.html
