Скажите 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);
    }
}
Другие вопросы по тегам