Есть ли способ синхронизации полос прокрутки в JavaFX 1.2 ListView? - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть несколько боковых просмотров списка. У меня есть способ убедиться, что «selectedIndex» одинаков для всех, но есть ли способ сделать так, чтобы полосы прокрутки ВСЕГДА синхронизировались?

Кажется, что полосы прокрутки будут синхронизироваться до тех пор, пока пользователь использует клавиши со стрелками при навигации вниз по списку, однако, если пользователь удерживает клавишу нажатой, или использует колесо мыши, они вообще не будут синхронизированы.

Ответы [ 2 ]

0 голосов
/ 04 марта 2015

Старый вопрос, но на случай, если кому-то будет интересно: теперь я использую приведенный ниже класс (протестировано в FX2.2) для синхронизации прокрутки 2 ListViews:

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);
0 голосов
/ 03 мая 2010

К сожалению, это невозможно, даже в версии 1.3 нет доступа к внутренней полосе прокрутки, а также есть способ настроить собственную полосу прокрутки. Если вы можете подать проблему с JavaFX Runtime, описав ваш вариант использования. http://javafx -jira.kenai.com

...