Скажите ScrollBars ScrollPane не покрывать содержимое ScrollPane
Как вы скажете ScrollPane, что его ScrollBars не должны покрывать содержимое ScrollPane?
Я попытался поместить горизонтальный ListView в ScrollPane, чтобы я мог добавить дополнительные элементы ListView или удалить их и иметь ScrollBar на случай, если их слишком много, чтобы отобразить в доступном пространстве. Однако всякий раз, когда это происходит, ScrollPane отображает ScrollBars, которые покрывают ListView. Таким образом, в случае нехватки места JavaFX уменьшает пространство еще больше, отображая полосы прокрутки таким образом.
Как мне исправить это поведение? Или я могу динамически изменять высоту содержимого ScrollPane? (Я только добавляю строки в ListView)
В конечном счете, я хочу добиться чего-то вроде списка тегов здесь в stackru, где вы можете добавлять теги и удалять их. Однако я не хочу, чтобы пользователь путался с тем, какой символ-разделитель использовать, и хотел бы использовать кнопки добавления и удаления.
Вот что я попробовал:
ScrollPane scrollPane = new ScrollPane();
ObservableList<String> translations = FXCollections.observableArrayList();
translations.add("100dsfsd");
translations.add("200saf");
translations.add("300w5346");
translations.add("400ztkzu");
translations.add("500a3244tgs");
translations.add("600a324");
translations.add("4tgsarawt");
translations.add("4tgsarawt");
translations.add("4tgsarawt");
ListView listView = new ListView();
listView.setItems(translations);
listView.setOrientation(Orientation.HORIZONTAL);
listView.setPrefHeight(30);
scrollPane.setContent(listView);
scrollPane.setFitToHeight(true);
scrollPane.setPrefViewportHeight(30);
scrollPane.setPrefViewportWidth(200);
scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
И вот как это выглядит:(
http://s14.directupload.net/images/140731/j3y6s3pw.png(Невозможно опубликовать изображения из-за репутации)
Или, может быть, есть более подходящий контроль для достижения этой цели?
1 ответ
ListView
уже поставляется с полосами прокрутки по мере необходимости; вам не нужно ставить ListView
в ScrollPane
,
Проблема в том, что вы ограничиваете высоту ListView
установив его prefHeight
имущество. Эта высота включает высоту полосы прокрутки. Вместо установки prefHeight
, установить maxHeight
до значения, которое достаточно велико, чтобы содержать содержимое и полосу прокрутки, если таковые имеются.
Также убедитесь, что вы используете макет контейнера, который позволит ему расти вертикально.
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class HorizListViewTest extends Application {
@Override
public void start(Stage primaryStage) {
ObservableList<String> translations = FXCollections.observableArrayList();
translations.add("100dsfsd");
translations.add("200saf");
translations.add("300w5346");
translations.add("400ztkzu");
translations.add("500a3244tgs");
translations.add("600a324");
translations.add("4tgsarawt");
translations.add("4tgsarawt");
translations.add("4tgsarawt");
ListView<String> listView = new ListView<>();
listView.setItems(translations);
listView.setOrientation(Orientation.HORIZONTAL);
listView.setMaxHeight(50);
BorderPane root = new BorderPane();
root.setCenter(new Label("Some content here"));
root.setBottom(listView);
Scene scene = new Scene(root, 400, 250);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}