代码之家  ›  专栏  ›  技术社区  ›  ardavis

在javafx 1.2列表视图中有没有同步滚动条的方法?

  •  0
  • ardavis  · 技术社区  · 15 年前

    我有多个侧边视图。我有办法确保“selectedIndex”在所有的滚动条上都是相同的,但是有办法使滚动条始终同步吗?

    似乎只要用户在浏览ListView时使用箭头键,滚动条就会同步,但是,如果用户按住键或使用鼠标滚轮,滚动条就不会同步。

    2 回复  |  直到 10 年前
        1
  •  0
  •   Rastislav Komara    15 年前

    不幸的是,这是不可能的,即使在1.3中也没有访问内部滚动条的权限,而且也有任何方法可以设置自定义滚动条。如果可以,请针对描述您的用例的javafx运行时提交一个问题。 http://javafx-jira.kenai.com

        2
  •  0
  •   Solostaran14    10 年前

    旧问题,但如果有人感兴趣:我现在使用下面的类(在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);
    
    推荐文章