JFoenix ライブラリを使用してシステムを開発しており、ウェーブ アニメーションのボタンをいくつか使用しています。しかし、ボタンを使用して新しいウィンドウを開いたり、たとえばリストをロードしたりすると、画面のロード中またはリストのロード中にアニメーションが一時的に「停止」します。リストをロードする前にアニメーションを実行する方法などを知りたいです。アニメーションがクラッシュしないようにします。Threads を使用してリストをロードしようとしましたが、スレッドを呼び出す関数がボタンのクリック関数内に入るため、アニメーションが同じようにロックされます。もう 1 つの例は、JavaFX トランジション アニメーションを使用して新しい AnchorPane を開く場合です。要素の読み込み中にアニメーションが一時的にハングし、アプリケーションの品質がすべて失われます。
例として、下の画像に示す「追加」ボタンをクリックすると、ボタン上に波形が生成され、AnchorPane を開く関数と、パネルを x = 0 の位置に移動するトランジション関数が実行されます。また、いくつかの要素を持つ単純な DropDownList も保持します。
ボタンがクリックされたときに実行されるコード:
@FXML
public void btnAddClique(ActionEvent event) {
if (telaAtual != 3) { //caso a tela de cadastro nao esteja aberta
PaneAdd add = new PaneAdd();
FXMLLoader loader = new FXMLLoader(getClass().getResource("PaneAdd.fxml"));
loader.setController(add);
try {
if (paneAtual == 1) {
paneFundo2.getChildren().setAll((Node)loader.load());
paneAtual = 2;
} else {
paneFundo.getChildren().setAll((Node)loader.load());
paneAtual = 1;
}
} catch (IOException e){
System.out.println("Erro ao alterar tela, função 'btnAddClique', classe FXMLDocumentController: " + e.toString());
}
telaAtual = 3;
new Thread(new RunAnimacaoAbertura()).start();
add.init(this.listView);
}
}
その後、アニメーション スレッドを実行します。
public class RunAnimacaoAbertura implements Runnable {
public void run() {
TranslateTransition tran = new TranslateTransition();
TranslateTransition tran2 = new TranslateTransition();
tran.setDuration(Duration.seconds(0.250));
tran2.setDuration(Duration.seconds(0.250));
tran.setNode(paneFundo);
tran2.setNode(paneFundo2);
if (paneAtual == 1) {
tran2.setFromX(0);
tran2.setToX(515);
tran.setFromX(-515);
tran.setToX(0);
} else {
tran.setFromX(0);
tran.setToX(515);
tran2.setFromX(-515);
tran2.setToX(0);
}
tran2.play();
tran.play();
}
}
最後に、リストをロードする機能を実行します。
public void init(JFXListView<Label> listView) {
listViewControler = listView;
cbGerentePA.setItems(arquivo.pegarListaString(1, 0));
date.setPromptText("Nascimento");
date.setEditable(false);
date.setDefaultColor(Color.web("#1abc9c"));
date.getStylesheets().add("agenda/style.css");
hBoxFundoDate.getChildren().setAll(date);
}