2010-04-28 52 views
0

我有多個listviews sidebyside。我有一種方法可以確保「selectedIndex」在它們全部是相同的,但是有沒有辦法讓滾動條始終保持同步?有沒有辦法在JavaFX 1.2 ListView中同步滾動條?

只要用戶在向下瀏覽列表視圖時使用箭頭鍵,似乎滾動條就會同步,但是,如果用戶向下鍵或使用鼠標輪,它們將根本不同步。

+0

如果你想有兩個列表視圖與selectedIndex總是相同的滾動位置總是相同什麼阻止你創建一個單一的列表視圖? – Honza 2010-04-28 16:17:41

回答

0

不幸的是,這是不可能的,即使在1.3沒有訪問內部滾動條,也有任何方式設置自定義滾動條。如果您可以請求對JavaFX Runtime提出描述您的用例的問題。 http://javafx-jira.kenai.com

0

老問題,但如果有人有興趣:我現在用下面的類(經測試,在FX2.2)同步的2名列表視圖滾動:

package fx.scrollbars; 

import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.geometry.Orientation; 
import javafx.scene.Node; 
import javafx.scene.control.ListView; 
import javafx.scene.control.ScrollBar; 

/** 
* Created by JRD on 03/03/2015. 
*/ 
public class ScrollbarsBinding { 

public static final int BIND_BIDIRECTIONAL = 3; 
public static final int BIND_RIGHT_TO_LEFT = 1; 
public static final int BIND_LEFT_TO_RIGHT = 2; 

/** 
* Bidirectional binding of 2 ListView's scrollbars. 
*/ 
public static void bind(ListView lv1, ListView lv2) { 
    bind(lv1, lv2, BIND_BIDIRECTIONAL); 
} 

/** 
* Allows binding of 2 ListView's scrollbars. 
* @param lv1 left list view 
* @param lv2 right list view 
* @param bindType 3 binding possibilities : BIND_BIDIRECTIONAL=bidirectional, BIND_RIGHT_TO_LEFT and BIND_LEFT_TO_RIGHT 
*/ 
public static void bind(ListView lv1, ListView lv2, int bindType) { 
    ScrollBar bar1 = null; 
    ScrollBar bar2 = null; 

    for (Node node : lv1.lookupAll(".scroll-bar")) { 
     if (node instanceof ScrollBar && ((ScrollBar)node).getOrientation().equals(Orientation.VERTICAL)) { 
      bar1 = (ScrollBar)node; 
     } 
    } 
    for (Node node : lv2.lookupAll(".scroll-bar")) { 
     if (node instanceof ScrollBar && ((ScrollBar)node).getOrientation().equals(Orientation.VERTICAL)) { 
      bar2 = (ScrollBar)node; 
     } 
    } 
    if (bar1 == null || bar2 == null) return; 

    final ScrollBar fbar1 = bar1; 
    final ScrollBar fbar2 = bar2; 
    if (fbar1 != null && (bindType & BIND_RIGHT_TO_LEFT) != 0) { 
     fbar1.valueProperty().addListener(new ChangeListener<Number>() { 
      @Override 
      public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { 
       fbar2.setValue(newValue.doubleValue()); 
      } 
     }); 
    } 
    if (fbar2 != null && (bindType & BIND_LEFT_TO_RIGHT) != 0) { 
     fbar2.valueProperty().addListener(new ChangeListener<Number>() { 
      @Override 
      public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { 
       fbar1.setValue(newValue.doubleValue()); 
      } 
     }); 
    } 
} 

// TODO: other JavaFx components ? 
} 

然後,我只需要調用這個代碼:

ScrollbarsBinding.bind(listView1, listView2); 
相關問題