2017-03-26 16 views
1

私はという名前のを持っています。このコードではプログラムがCPU時間を大量に消費することになりますが、ラムダ式に慣れていないので、これを書くための簡単な方法がありますか? :TableViewでScrollEventを処理するには、あまりにも多くのCPU時間がかかります

tableVerre.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { 

    @Override 
    public void handle(ScrollEvent scrollEvent) { 

    stock.setCellFactory(column -> { 

    return new TableCell<VerreFX, Number>() { 
     @Override 
     protected void updateItem(Number item, boolean empty) { 
     super.updateItem(item, empty); 

      TableRow<VerreFX> currentRow = getTableRow(); 

      if (empty || item == null) { 
       setText(""); 
       setGraphic(null); 
       currentRow.setStyle(tableVerre.getStyle()); 
      } else { 
       setText(getItem().toString()); 
      } 

      if (!isEmpty()) { 
       if ((int) item == 0 && st.getVerresBOX()) currentRow.setStyle("-fx-background-color:lightcoral"); 
      } 
     } 
    }; 
}); 

      } 
    }); 
+0

なぜスクロールハンドラの 'cellFactory'を置き換えますか?テーブルのサイズを変更しない限り、おそらくセルは再作成されません。 – fabian

+0

どこに置くのですか?テーブルのサイズを変更せずにセルを再作成します。 –

+0

新しいセルファクトリ(AFAIK)を設定すると、セルが再作成されます。セルファクトリを継続的に置き換えない場合、ユーザがスクロールすると、それらは単に再利用されます( 'updateItem(...)'メソッドは既存のセルで呼び出されます)。明らかに、 'updateItem()'を呼び出すだけでは、すべてのセルを繰り返し置き換えるよりもパフォーマンスが大幅に低下します。 –

答えて

2

テーブルビューには、ユーザーがスクロールとして細胞を再利用し、彼らは新しいアイテムのために再利用されたときに自動的にセルにupdateItemを呼び出します。したがって、セルファクトリを1回だけ設定してから、テーブルビューでその作業を行うようにしてください。 FXMLを使用している場合は、initialize()メソッドでセルファクトリを設定することができます。

セルの実装は正しくありません。セルを2つの異なるアイテムを任意に表示するために再利用できるため、すべての条件を考慮する必要があります。あなたの実装では、セルがitem.intValue()==0の項目を表示し、次にitem.intValue() != 0の項目を表示するために再利用されると、スタイルは正しく更新されません。

Numberをにコールしてintに「変換する」必要があります。

TableColumn<VerreFX, Number> stock ; 

// ... 

stock.setCellFactory(column -> new TableCell<VerreFX, Number>() { 
    @Override 
    protected void updateItem(Number item, boolean empty) { 
     super.updateItem(item, empty); 

     TableRow<VerreFX> currentRow = getTableRow(); 

     if (empty || item == null) { 
      setText(""); 
      setGraphic(null); 
      currentRow.setStyle(tableVerre.getStyle()); 
     } else { 
      setText(getItem().toString()); 
     } 

     if (!isEmpty()) { 
      if (item.intValue() == 0 && st.getVerresBOX()) { 
       currentRow.setStyle("-fx-background-color:lightcoral"); 
      } else { 
       currentRow.setStyle(tableVerre.getStyle()); 
      } 
     } 
    } 
}); 

スクロールイベントハンドラを完全に削除する必要があります。

+0

はいfxmlを使用していて、initialize()でセルファクトリを設定するのは私のアプローチでしたが、一度行を変更するとその行に表示されているすべてのセルが同じスタイルになります!自身を更新しませんでした。 –

+0

私が指摘したバグのせいではありませんか? –

+0

あなたが言いましたが、私はそのバグを持っていません!私はこれまでに、問題のコードであるCPU時間を消費する(各スクロールイベントでセルを更新する)解決策を見つけました。スクロールが完了したときにセルを更新することでこれを防ぐ手段を発見しました。ありがとうございましたJames –

1

まず、ユーザーがキーの下/上を使用してスクロールするか、スクロールバーを使用してスクロールイベントが発生しないため、すべてのスクロール状況をカバーしていない場合は、したがって、2つを追加する必要がありますEventFilter、最初のスクロールバーを使用してスクロールを処理します。

tableVerre.addEventFilter(MouseEvent.MOUSE_CLICKED,(
      MouseEvent event)-> 
    { 
     if ((event.getTarget() instanceof TableColumnHeader) | event.isDragDetect()) { 
      System.err.println("Mouse Draged : " + event.toString()); 

      stock.setCellFactory((TableColumn<VerreFX, Number> column) -> { 

       return new TableCell<VerreFX, Number>() { 
        @Override 
        protected void updateItem(Number item, boolean empty) { 
         super.updateItem(item, empty); 

         TableRow<VerreFX> currentRow = getTableRow(); 

         if (empty || item == null) { 
          setText(""); 
          setGraphic(null); 
          currentRow.setStyle(tableVerre.getStyle()); 
         } else { 
          setText(getItem().toString()); 
         } 

         if (!isEmpty()) { 
          if ((int) item == 0 && st.getVerresBOX()) { 
           currentRow.setStyle("-fx-background-color:lightcoral"); 
          } 
         } 
        } 
       }; 
      }); 
     } 
    }); 

もう1つは、キーボードのキーダウン/ダウンを使用してスクロールを処理します。

tableVerre.addEventFilter(KeyEvent.KEY_PRESSED,new EventHandler<KeyEvent>(){ 
    @Override 
    public void handle(KeyEvent event) { 
     if (event.getCode() == KeyCode.DOWN | event.getCode() == KeyCode.UP) { 
      stock.setCellFactory(column -> { 

       return new TableCell<VerreFX, Number>() { 
        @Override 
        protected void updateItem(Number item, boolean empty) { 
         super.updateItem(item, empty); 

         TableRow<VerreFX> currentRow = getTableRow(); 

         if (empty || item == null) { 
          setText(""); 
          setGraphic(null); 
          currentRow.setStyle(tableVerre.getStyle()); 
         } else { 
          setText(getItem().toString()); 
         } 

         if (!isEmpty()) { 
          if ((int) item == 0 && st.getVerresBOX()) { 
           currentRow.setStyle("-fx-background-color:lightcoral"); 
          } 
         } 
        } 
       }; 
      }); 
     } 
     System.err.println("Key Pressed : " + event.toString()); 
    } 
}); 
+0

実用的な発言、ありがとう –

関連する問題