我有多個listviews sidebyside。我有一種方法可以確保「selectedIndex」在它們全部是相同的,但是有沒有辦法讓滾動條始終保持同步?有沒有辦法在JavaFX 1.2 ListView中同步滾動條?
只要用戶在向下瀏覽列表視圖時使用箭頭鍵,似乎滾動條就會同步,但是,如果用戶向下鍵或使用鼠標輪,它們將根本不同步。
我有多個listviews sidebyside。我有一種方法可以確保「selectedIndex」在它們全部是相同的,但是有沒有辦法讓滾動條始終保持同步?有沒有辦法在JavaFX 1.2 ListView中同步滾動條?
只要用戶在向下瀏覽列表視圖時使用箭頭鍵,似乎滾動條就會同步,但是,如果用戶向下鍵或使用鼠標輪,它們將根本不同步。
不幸的是,這是不可能的,即使在1.3沒有訪問內部滾動條,也有任何方式設置自定義滾動條。如果您可以請求對JavaFX Runtime提出描述您的用例的問題。 http://javafx-jira.kenai.com
老問題,但如果有人有興趣:我現在用下面的類(經測試,在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);
如果你想有兩個列表視圖與selectedIndex總是相同的滾動位置總是相同什麼阻止你創建一個單一的列表視圖? – Honza 2010-04-28 16:17:41