2012-11-02 107 views
1

我的JavaFX項目存在問題。有一段時間我無法理解。據我瞭解下面的代碼應該能夠處理,這是TableView中TableView的JavaFX滾動事件處理

 table.setOnScroll(new EventHandler<ScrollEvent>() { 
      @Override 
      public void handle(ScrollEvent scrollEvent) { 
       System.out.println("Hello!"); 
       int i = 0; 
       int length = table.getItems().size(); 
       for(Node n: table.lookupAll("TableRow")) { 
        if (n instanceof TableRow) { 
         TableRow row = (TableRow) n; 
         if(table.getItems().get(i).getType() == "fwfx") {      
          row.setStyle("-fx-background-color: forestgreen;"); 
         } 
         i++; 
        } 
        if(i == length) { 
         break; 
        } 
       } 
      } 
     } 
    ); 

的一個實例,每當我啓動它正確地強調行,只有可見行應用程序的所有滾動事件。我找到了它,因爲

table.lookupAll("TableRow") 

爲我返回只有17個節點的集合。雖然

table.getItems().size() 

顯示正確的行數。如果我向下滾動表格,則會看到突出顯示的未批准行。我迷失了一下。

所以問題是我如何正確處理我的表的滾動事件?我需要處理表格的所有行,不僅可見。

+0

我沒有得到你想要在這裏實現的。然而,'table.lookupAll(...)'返回的行數是由於TableView類將重複使用節點來渲染行的結果。如果您的表格包含一百萬個項目,則仍然只會創建足夠的節點,以便在屏幕上顯示所有內容。因此,我猜你的'不正確'突出顯示的行是重用的節點,沒有將它們的CSS重置(由你)。 – sarcan

+0

謝謝你的回覆@sarcan!我認爲你對節點的使用是正確的。我試圖通過在用戶滾動鼠標時「刷新」節點來避免它。也許我「刷新了」錯誤的東西...... 只要我找到正確的解決方案,我會在這裏發佈。 – Oleg

回答

4

所以最後我找到了處理滾動事件的方式,我想分享我的經驗。使用Scenic View我發現TableView setOnScroll事件僅當您將鼠標滾輪移動到列標題上時纔會觸發。但是爲了能夠在光標位於表格數據上方時處理ScrollEvent(在我的示例中需要),需要確保使用EventFilter。例如,下面的colde將處理所有滾動事件 TableView中的實例

table.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { 
      @Override 
      public void handle(ScrollEvent scrollEvent) { 
       System.out.println("Scrolled."); 
      } 
    }); 

曉暉也給了我什麼TableView中由後

stage.show() 

已經工作的提示。

Althougth我還沒有正確地強調了行)...

1

聽滾動條值更改

for (Node node : dataTable.lookupAll(".scroll-bar")) 
{ 
    if (node instanceof ScrollBar && ((ScrollBar) node).getOrientation().equals(Orientation.VERTICAL)) 
    { 
     ((ScrollBar) node).valueProperty().addListener(formatBUIScrollChangeEventHandler); 
    } 
} 

這將在任何形式的滾動在桌子上的觸發。

已經花了幾個小時,終於在解決我自己的情況時出現這個想法。

0

問題是舊的,但你還沒有發佈/接受答案呢。

所以,這schould幫助:tableView.refresh()。它自Java 8u60起可用於JavaFX。

你必須在你的ScrollEvent中調用它。也可以通過排序和拖動ScrollBar(請參閱我的回答here)。