如何使用Java FX制作动画而没有停顿或滞后

时间:2018-06-21 17:40:28

标签: multithreading animation javafx transition jfoenix

我正在使用JFoenix库开发系统,并且正在使用带有wave动画的一些按钮。但是,当我使用按钮打开新窗口或加载列表时,动画会在屏幕加载或列表加载时短暂地“停止”。我想知道如何在加载列表或类似内容之前运行动画。不要让动画崩溃。我尝试使用线程来加载列表,但是,由于调用线程的函数位于按钮的click函数内部,因此动画以相同的方式锁定。 另一个例子是,当我使用JavaFX过渡动画打开新的AnchorPane时,正在加载其元素时,该动画短暂挂起,这剥夺了应用程序的全部质量

例如,当我单击下图所示的“添加”按钮时,它会在按钮上生成一个波形,然后执行打开AnchorPane的功能和将面板移至x = 0位置的转换功能。并且还带有一个带有某些元素的简单DropDownList。

enter image description here

单击按钮时执行的代码:

@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);
    }

0 个答案:

没有答案