2014-02-22 77 views
0

我爲加載Java對象創建了這個簡單的測試。但不幸的是,我不能將它用於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

爲什麼不能在SQL查詢中使用它? – ItachiUchiha

+0

因爲當我點擊UI組件加載對象時,應用程序凍結1-2秒。 –

+0

在您的someData()中,您正在使Javafx UI線程在返回標籤之前睡眠6秒。請檢查它。 除此之外,將所有數據加載事件放入Task類中,以便它不會影響UI,同時數據從數據庫加載 – ItachiUchiha

回答

2

當你調用obj.someData()

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

你實際上是直接從UI線程調用它,我不知道爲什麼!儘量不要這樣做。如果這是真的很重要,儘量去除

Thread.sleep(6000); 

其次,您使用的是服務類的實例,但你永遠不會使用它。請閱讀JavaFX Concurrency的文檔。

就像一個忠告,首先嚐試玩弄只有Task,纔去服務

如果您還有疑問,請隨時發表評論!

+0

如何將Task中的結果顯示在GUI中? –

+0

你必須在任務線程中使用Platform.runLater()。這是一個鏈接https://community.oracle.com/message/10864775#10864775 – ItachiUchiha