测试加载消息

时间:2014-02-22 20:10:36

标签: java javafx javafx-2 javafx-8

我创建了这个加载Java Object的简单测试。但遗憾的是,我无法将其用于SQL查询的大规模测试。

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.collections.ObservableList;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class MainApp extends Application
{

    GetDailySalesService service = new GetDailySalesService();
    TestData obj;

    @Override
    public void start(Stage stage) throws Exception
    {

        obj = new TestData();

        HBox hb = new HBox(100);

        Tab tabA = new Tab("test");

        Button button = new Button("Test");

        ///////////
        Region veil = new Region();
        veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.4)");
        veil.setPrefSize(240, 160);
        ProgressIndicator p = new ProgressIndicator();
        p.setMaxSize(140, 140);

        p.progressProperty().bind(service.progressProperty());
        veil.visibleProperty().bind(service.runningProperty());
        p.visibleProperty().bind(service.runningProperty());
        //tableView.itemsProperty().bind(service.valueProperty());
        //tableView.setMinSize(240, 140);
        StackPane stack = new StackPane();
        stack.getChildren().addAll(obj.someData(), veil, p);

        service.start();

        //////////////////
        button.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent e)
            {
                tabA.setContent(stack);
            }
        });

        TabPane tb = new TabPane();
        tb.setPrefSize(300, 300);

        tb.getTabs().add(tabA);

        hb.getChildren().addAll(button, tb);

        hb.setPadding(new Insets(20, 20, 20, 20));
        hb.setAlignment(Pos.CENTER);
        Scene scene = new Scene(hb, 500, 300);

        stage.setTitle("JavaFX and Maven");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }

    class TestData
    {

        public Label someData() throws InterruptedException
        {

            Label lb = new Label("It's working!!!!");

            Thread.sleep(6000);

            return lb;
        }
    }

    class GetDailySalesService extends Service<ObservableList<Object>>
    {

        @Override
        protected Task createTask()
        {
            return new GetDailySalesTask();
        }
    }

    class GetDailySalesTask extends Task<ObservableList<Object>>
    {

        @Override
        protected ObservableList<Object> call() throws Exception
        {

            return (ObservableList<Object>) obj.someData();
        }
    }
}

您能否告诉我这是实施此测试并改进代码的正确方法。

1 个答案:

答案 0 :(得分:2)

中呼叫obj.someData()
stack.getChildren().addAll(obj.someData(), veil, p);

你实际上是直接从UI线程调用它,我不知道为什么!尽量不要这样做。如果它非常重要,请尝试删除

Thread.sleep(6000);

其次,您正在使用Service类实例,但您从未使用它。请查看JavaFX Concurrency中的文档。

作为一条建议,请先尝试使用Task,然后再去服务

如果您仍有疑问,请随时发表评论!