我创建了这个加载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();
}
}
}
您能否告诉我这是实施此测试并改进代码的正确方法。
答案 0 :(得分:2)
在
中呼叫obj.someData()
时
stack.getChildren().addAll(obj.someData(), veil, p);
你实际上是直接从UI线程调用它,我不知道为什么!尽量不要这样做。如果它非常重要,请尝试删除
Thread.sleep(6000);
其次,您正在使用Service类实例,但您从未使用它。请查看JavaFX Concurrency中的文档。
作为一条建议,请先尝试使用Task,然后再去服务
如果您仍有疑问,请随时发表评论!