2013-12-02 5 views
2

У меня есть ярлык внутри ScrollPane. Я обновляю метку в цикле (в другом потоке). Как я могу обновить ScrollPane, чтобы он прокручивался вниз (не вбок, это будет сделано вручную), если пользователь не удерживает его в позиции? Есть ли для этого сеттер?JavaFX - автоматически прокручивать ScrollPane

+0

Не мог бы вы объяснить это 'если трюм пользователя оленьей кожи это на позиции'? – Math

+0

Если пользователь не прокручивается. – user3029101

ответ

1

@math спасибо, что работал!

@FXML private ScrollPane scroll; //this must match the fx:id of the ScrollPane element or be the scrollpane object 
scroll.setVvalue(1.0);   //1.0 means 100% at the bottom 

И я решил эту проблему «необходимо смотрящей на вкладке» с этой частью кода

tab.setOnSelectionChanged(new EventHandler<Event>() { 
    @Override 
    public void handle(Event arg0) { 
     ScrollPane.setVvalue(1.0); 
    }   
}); 
+0

На самом деле в вашем вопросе не так много информации о том, какое событие должно уволить свиток, поэтому мне было невозможно определить его самостоятельно. – Math

+0

Спасибо в любом случае. Вся проблема - вкладка, но я думал, что должен включить то, что я сделал, на случай, если кто-то найдет это полезным! – user3029101

8

Чтобы установить ScrollPane в нижней части автоматически устанавливается vvalue элемента ScrollPane, как это:

@FXML private ScrollPane scroll; //this must match the fx:id of the ScrollPane element 
scroll.setVvalue(1.0);   //1.0 means 100% at the bottom 
+0

Это не работает. (Offtopic: зачем использовать FXML? (Иногда я использую java и CSS)). Фактически, он работает, только если я на вкладке. (Если я открыл конкретную вкладку) – user3029101

+0

Файл 'FXML', где вы создаете свою сцену, затем в' Controller.java' вы управляете элементами, связывающими переменную через элемент 'fx: id'. Если он работает только в том случае, если вы находитесь на вкладке, это означает, что вы должны поместить '.setVvalue()' в другое место, в зависимости от того, когда вы хотите его запустить, возможно, где-то в потоке, где вы пишете в своей этикетке , – Math

+0

Я строю свою сцену с чистой java – user3029101

5

Если вы используете либо HBox или VBox в ScrollPane, попробуйте следующее:

hBox.heightProperty().addListener(new ChangeListener() { 
    @Override 
    public void changed(ObservableValue observable, Object oldvalue, Object newValue) { 
     scrollPane.setHvalue((Double)newValue); 
    } 
}); 
+0

Это работает только случайно, когда высота окна больше или равна '1.0', это максимальное значение по умолчанию для свойства' hvalue', которое, в свою очередь, должно быть 'vvalue'. Таким образом, прослушиватель недействительности достаточно. См. [Мой ответ] (https://stackoverflow.com/a/49037369/3453226) для более правильного решения. –

0

Это работает в моем коде:

scrollPane.vvalueProperty().bind(mainGrid.heightProperty()); 

в моем случае ScrollPane содержит mainGrid

0

Для прокрутки панели прокрутки в нижней части полностью, установите его vvalue property в 1.0:

scrollPane.setVvalue(1D); 

Примечание это может не работать при вызове после изменения содержимого панели скроллинга.
В таком случае, если задержки вызова через Platform.runLater() не решает проблему, рассмотреть вопрос об установлении значения свойства в ответ на событие содержания height property недействительности:

vBox.heightProperty().addListener(observable -> scrollPane.setVvalue(1D)); 
Смежные вопросы