2016-09-23 1 views
3

私は文書ファイルのデータストレージに接続されているJavaFxプロジェクトをやっています。最近私はいくつかの特定の点では非常にゆっくりと実行することに気づいた。実行が開始されると、データ量を考慮してかなり高速なドキュメントからデータを取得し、テーブルにロードするために定義したクラスのインスタンスを作成します(ここまではOKです)。私のJavaFxアプリケーションは非常に遅いです

public void createCheckbox() { 
     List<String> columnnames = Arrays.asList("id", "name", "bg", "country","countryCode", "status", 
       "incorporationDate","aclName","aclDomain"); 
     for (int i = 0; i <= columnnames.size() - 1 ; i++) { 
      ColumnConstraints column1 = new ColumnConstraints(); 
      column1.setPercentWidth(22.0); 

      gridChkBoxContainer.getColumnConstraints().add(column1); 
      CheckBox cbs = new CheckBox(columnnames.get(i)); 
      cbs.selectedProperty().set(true); 
      gridChkBoxContainer.add(cbs, i, 0); 
     } 
    } 


    public void createTable() { 
     int count = 0 ; 
     infoTable.getColumns().clear(); 
     CheckBox cb; 
     ObservableList<Node> childrens = gridChkBoxContainer.getChildren(); 
     for (Node node : childrens) { 
      cb = (CheckBox) node; 
      if (cb.isSelected()) { 
       TableColumn Col = new TableColumn(cb.getText()); 
       Col.prefWidthProperty().bind(infoTable.widthProperty().divide(6)); 
       Col.setCellValueFactory(new PropertyValueFactory<Report, String>(cb.getText())); 
       infoTable.getColumns().add(Col); 
      } 
     } 

     try{ 
      infoTable.getItems().clear(); 
      if (txtKeyword.getText().compareTo("") == 0){ 


      strDQL = "select dm_dbo.cosec_general_view.name , dm_dbo.cosec_general_view.comp_id , dm_dbo.cosec_general_view.bg_name , dm_dbo.cosec_general_view.incorporation_date , dm_dbo.cosec_general_view.status , dm_dbo.cosec_general_view.country_name , cosec_general.acl_domain , cosec_general.acl_name , cosec_general.country_code from dm_dbo.cosec_general_view , cosec_general where dm_dbo.cosec_general_view.comp_id =cosec_general.comp_id"; 
      }else{ 
       strDQL = "select dm_dbo.cosec_general_view.name , dm_dbo.cosec_general_view.comp_id , dm_dbo.cosec_general_view.bg_name , dm_dbo.cosec_general_view.incorporation_date , dm_dbo.cosec_general_view.status , dm_dbo.cosec_general_view.country_name , cosec_general.acl_domain , cosec_general.acl_name , cosec_general.country_code from dm_dbo.cosec_general_view , cosec_general where dm_dbo.cosec_general_view.comp_id =cosec_general.comp_id and (UPPER(dm_dbo.cosec_general_view.comp_id) like UPPER('@aclname') or UPPER(dm_dbo.cosec_general_view.name) like UPPER('@aclname')or UPPER(dm_dbo.cosec_general_view.bg_name) like UPPER('@aclname') or UPPER(dm_dbo.cosec_general_view.incorporation_date) like UPPER('@aclname') or UPPER(dm_dbo.cosec_general_view.country_name) like UPPER('@aclname') or UPPER(dm_dbo.cosec_general_view.status) like UPPER('@aclname') or UPPER(cosec_general.acl_name) like UPPER('@aclname')or UPPER(cosec_general.acl_domain) like UPPER('@aclname')or UPPER(cosec_general.country_code) like UPPER('@aclname'))"; 

       String searchVar = "%"+txtKeyword.getText()+"%"; 
       strDQL = strDQL.replace("@aclname", searchVar); 

      } 
      IDfQuery ACLQuery = new DfQuery(); 
      ACLQuery.setDQL(strDQL); 
      IDfCollection col = ACLQuery.execute(_session, DfQuery.DF_READ_QUERY); 
      while (col.next()) { 
       BGDetails bgInfo = new BGDetails(col.getString("comp_id"), col.getString("name"), col.getString("bg_name"), 
         col.getString("country_name"), col.getString("status"), col.getString("incorporation_date"),col.getString("acl_name"),col.getString("acl_domain"),col.getString("country_code")); 

       infoTable.getItems().add(bgInfo); 
       count++; 

      }}catch(Exception e){ 
       Alert alert = new Alert (Alert.AlertType.ERROR , "An Error was found!"); 
       alert.showAndWait(); 
      } 


    if (count == 0){ 
     Alert alert = new Alert(Alert.AlertType.WARNING , "No search result was found !"); 
     alert.showAndWait(); 

    } 
    } 

し、テキストフィールドには、(FX:idは=「txtKeyword」)がある。そうするために私の機能であるデータを検索するためである上に。以前にフェッチしたデータを格納するのではなく、新しいDQLを作成してデータストアから再度フェッチするようにカスタマイズすることに言及する価値があります。私は、現時点では、実行に時間がかかるデータの取得ではなく、検索フィールドへの単語のキーイングが目立って遅れていることに気付きました。つまり、キーボードまたはマウスを使用してアプリをナビゲートするたびに遅れが始まり、それ以外の時間は問題ありません。どのようにすればパフォーマンスのスピードを向上させることができますか? ありがとうございます。

+0

- コードの実行をあなたがするとき?おそらくあなたのためにいくつかの 'ChangeListener'が登録されていますか?またはテキストの変更ごとに 'createTable'メソッドが呼び出されますか? – Itai

+0

@sillyflyテキストフィールド(txtKeyword)をクリックしてテキストを入力すると、それが遅れます(言い換えれば、テキストフィールドでクリックしたことを理解するのに時間がかかります)。データを挿入している間キーボードを使用してテキストフィールドに移動すると、私の入力速度はそれほど高くないと考えて、Dは –

+0

私はその部分を理解しました。私は何を求めているのですか?コードのどの部分が、 'TextField'の中のテキストのすべての変更を押しますか?それは 'createTable'メソッドですか?または、その質問に含まれていない他のコード? – Itai

答えて

2

JavaFX Threadと関係のないことは、外部のThread、特にデータベースクエリのもので行われます。 JavaFXのサービスの

例の構造は、[tutorial]以下は、SQLiteのを使用した例です):

あなたがテキストフィールドに入力したときにパフォーマンスの問題が発生したと述べている
public class DataLoader extends Service<Boolean> { 

    int total; 

    /** 
    * Constructor 
    */ 
    public DataLoader() { 

     // if succeeded 
     setOnSucceeded(s -> { 
      //code if Service succeeds 
     }); 

     // if failed 
     setOnFailed(fail -> { 
      //code it Service fails 
     }); 

     //if canceled 
     setOnCancelled(cancelled->{ 
      //code if Service get's cancelled 
     }); 
    } 

    @Override 
    protected Task<Boolean> createTask() { 
     return new Task<Boolean>() { 
      @Override 
      protected Void call() throws Exception { 

       // -------------------------- Load all the libraries 
       try (ResultSet resultSet = connection1.createStatement().executeQuery("SELECT* FROM LIBRARIES;"); 
         ResultSet dbCounter = connection1.createStatement() 
           .executeQuery("SELECT COUNT(*) FROM LIBRARIES;");) { 

        total = dbCounter.getInt(1); 
        Main.logger.info("Uploading libraries...."); 

        // Refresh the text 
        Platform.runLater(() -> Main.updateScreen.label.setText("Uploading Libraries...")); 
        updateProgress(1, 2); 

        // Load all the libraries 
        while (resultSet.next()) { 

         Library library = new Library(resultSet.getString("NAME"), resultSet.getString("TABLENAME"), 
           resultSet.getDouble("STARS"), resultSet.getString("DATECREATED"), 
           resultSet.getString("TIMECREATED"), resultSet.getString("DESCRIPTION"), 
           resultSet.getInt("SAVEMODE"), resultSet.getInt("POSITION"), 
           resultSet.getString("LIBRARYIMAGE"), resultSet.getBoolean("OPENED")); 

         //Using Platform Later to Modify JavaFX Nodes 
         Platform.runLater(()->{ 
          //code here 
         }); 

         updateProgress(resultSet.getRow(), total); 
        } 

       } catch (Exception ex) { 
        Main.logger.log(Level.SEVERE, "", ex); 
        return false //something bad happened 
       } 

       return true; 
      } 
     }; 
    } 

}