告诉ScrollPane的ScrollBars不要覆盖ScrollPane的内容

时间:2014-07-31 09:23:36

标签: listview javafx scrollbar scrollpane

如何告诉ScrollPane,它的ScrollBars不会涵盖ScrollPane的内容?

我尝试将一个水平ListView放入ScrollPane中,这样我就可以添加其他ListView项目或删除它们并拥有一个ScrollBar,以防它们太多而无法在可用空间中显示。但是,只要发生这种情况,ScrollPane就会显示ScrollBars,它覆盖ListView。因此,如果空间不足,JavaFX会以这种方式显示ScrollBars,从而进一步减少空间。

如何解决此问题? 或者我可以动态更改ScrollPane内容的高度吗? (我只将字符串添加到ListView中)

最终,我希望在stackoverflow上实现类似标签列表的内容,您可以在其中添加标签并将其删除。但是,我不希望用户混淆使用哪个分隔符,并希望使用添加和删除按钮。

以下是我的尝试:

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 个答案:

答案 0 :(得分: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);
    }
}