Я пытаюсь изменить элемент управления TabPage в JavaFx 8, чтобы он показывал в окне просмотра некоторые вкладки вперед (справа) текущего выбранного, или если выбранная вкладка находится в крайнем левом углу заголовка, она показывает близлежащие вкладки перед текущим.Показывать некоторые вкладки впереди из выбранной вкладки в заголовке Tab Tab JavaFx 8
Как сейчас:
Как я пытаюсь заставить его вести себя как:
Когда пользователь выбирает вкладку индекса X, вкладку заголовок панели показывает еще 2 или 3 соседних вкладки.
Это то, что я пробовал до сих пор, без каких-либо успехов, по-видимому, слишком короткий код, чтобы поток интерфейса синхронизировал выбор вкладок вовремя (идея состояла в том, чтобы выбрать вкладку вперед, а затем вернуться к выбранной пользователем, что делает заголовок выявить вкладки после выбранной вкладки):
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
public class TabSelectionListener implements ChangeListener<Tab> {
protected TabPane owner;
protected boolean lock;
protected int nextItems;
TabSelectionListener(TabPane listenTo){
owner = listenTo;
lock = false;
nextItems = 2;
}
TabSelectionListener(TabPane listenTo, int minimalInFront){
owner = listenTo;
lock = false;
nextItems = minimalInFront;
}
@Override
public void changed(ObservableValue<? extends Tab> list, Tab old, Tab newT) {
int maxTab;
int curTab;
int i;
// Locks this listener, because the selections owner.getSelectionModel().select(X)
// will call this listener again, and we are calling those from here.
if(!lock){
lock = true;
maxTab = owner.getTabs().size() - 1;
curTab = owner.getSelectionModel().getSelectedIndex();
for(i = 0; i < nextItems && curTab + i < maxTab; i++);
owner.getSelectionModel().select(i); // int overload
owner.getSelectionModel().select(newT);
lock = false;
}
}
}
tabPane называет его для каждого выбора вкладки:
tabPane.getSelectionModel().selectedItemProperty().addListener(new TabSelectionListener(tabPane,3));
Я читал некоторые темы здесь, и появляется для меня, что заголовок на самом деле является StackPane, и может можно получить, выполнив:
StackPane region = (StackPane) tabPane.lookup(".headers-region");
Он работает, но после того, что я не знаю, как получить доступ к свойствам, которые реализуют поведение по умолчанию.
Любые предложения?
Спасибо за чтение.