首页 > 其他分享 >如何为布局增加滚动条_使用ScrollPane

如何为布局增加滚动条_使用ScrollPane

时间:2023-06-03 20:55:57浏览次数:31  
标签:listPane 布局 label 滚动条 VBox ScrollPane scrollPane

如何为布局增加滚动条_使用ScrollPane

当我们使用某些布局时候,比如VBox,其容纳的控件超过了显示大小时,我们可能无法看到这些控件。

解决方案是为Vbox增加一个滚动条,从而可以滚动地显示更多内容,这就要用到 ScrollPane 。

ScrollPane 是一种特护的控件,它可以设置一个布局作为其内容,然后为其在合适的时候增加一个滚动条。

效果展示

image

示例代码

我们的示例代码制作了一个叫做 LabelList 的工具,它的作用是在VBox中可以动态地不断添加Label,当显示窗口容纳不下时,就会有滚动条出现。

下面是 LabelList 的实现:

import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox;

public class LabelList
{
    private ScrollPane scrollPane;
    private VBox listPane;
    private int maxLabelCount;
    private boolean addToBottom;

    public LabelList(int maxLabelCount, boolean addToBottom)
    {
        listPane = new VBox();

        scrollPane = new ScrollPane();
        scrollPane.setContent(listPane);
        scrollPane.setFitToWidth(true); // 不显示横向滚动条

        this.maxLabelCount = maxLabelCount;

        this.addToBottom = addToBottom;
    }

    public Control getControl()
    {
        return scrollPane;
    }

    public Label addLabel(String labelText)
    {
        if (listPane.getChildren().size() >= maxLabelCount)
        {
            if (addToBottom)
            {
                listPane.getChildren().remove(0);
            }
            else
            {
                listPane.getChildren().remove(listPane.getChildren().size() - 1);
            }
        }

        if (addToBottom)
        {
            scrollPane.setVvalue(1.0); // 自动下拉到底部
        }

        Label label = new Label(labelText);
        label.setPrefWidth(scrollPane.getWidth() * 0.99);

        label.setOnMouseEntered((e) -> {
            label.setStyle("-fx-background-color: #F0F8FF;");
        });
        label.setOnMouseExited((e) -> {
            label.setStyle("-fx-background-color: transparent;");
        });

        if (addToBottom)
        {
            listPane.getChildren().add(label);
        }
        else
        {
            listPane.getChildren().add(0, label);
        }

        return label;
    }
}

测试代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class LabelListExample extends Application
{
    private int counter = 0;

    @Override
    public void start(Stage window) throws Exception
    {
        VBox root = new VBox();
        root.setSpacing(10);

        LabelList list = new LabelList(50, true);
        list.getControl().prefHeightProperty().bind(root.heightProperty().divide(2));

        Button button = new Button("Click to Add");
        button.setOnAction(e -> {
            counter++;
            list.addLabel("Hello World " + counter);
        });

        root.getChildren().addAll(list.getControl(), button);

        Scene scene = new Scene(root, 400, 300);

        window.setScene(scene);
        window.setTitle(this.getClass().getSimpleName());
        window.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }
}

代码说明

我们通过下面的代码,创建了 ScrollPane ,并且设置了其内容,同时不开启横向滚动条:

scrollPane = new ScrollPane();
scrollPane.setContent(listPane);
scrollPane.setFitToWidth(true); // 不显示横向滚动条

接下来我们提供了一个 addLabel 函数,它向VBox中添加了一个Label。这个Label是添加到VBox中的,而ScrollPane却可以自动对Vbox进行调整。

测试代码中,每点击一次Button,就会调用一次 addLabel 来添加Label。

我们使用 list.getControl().prefHeightProperty().bind(root.heightProperty().divide(2)); 来设置 LabelList 的高度,随时保持和窗口高度的一半一致。

总结

要实现布局增加滚动条的效果,需要按照以下步骤进行操作:

  1. 创建一个ScrollPane对象。
  2. 将要滚动显示的布局设置为ScrollPane的内容(即一个布局)。
  3. 根据需要设置ScrollPane的滚动条属性,如横向滚动条的显示与否。
  4. 可选:根据需要调整LabelList的高度与窗口高度的关联关系。

之后,我们向布局中添加内容,ScrollPane就会自动进行调整。

标签:listPane,布局,label,滚动条,VBox,ScrollPane,scrollPane
From: https://www.cnblogs.com/javafx-howto/p/17454632.html

相关文章

  • 修改Launcher界面应用布局
    需求:将指定应用添加到Launcher界面布局上结题思路:1.获取当前Launcher界面窗口包名,应用名,定位当前源码位置  adbshelldumpsyswindow |findstrmFocusedApp  ;  adbshellpmpathcom.android.launcher3  ;2.查看设备上的Lancher当前界面属于哪一种类型:3*......
  • 优秀的CSS布局大全
    这份列表收集一些比较优秀的CSS布局,这些布局都免费供个人和商业使用。当然,你使用之前还是得看版权说明,也许会发生许可协议变更。LayoutGala-这个网站收集了40多个专业的CSS布局,每个布局都通过了CSS和HTML验证,且不需要Hack,兼容各大主流浏览器。CSSLayouts –另一个专门收集CSS......
  • 利用Flutter的LayoutBuilder、BoxConstraints创建自适应布局控件
    简介在Flutter中,LayoutBuilder是一个Widget,用于构建一个包含父组件约束的子组件。它可以获取父组件的约束信息并将其传递给子组件进行布局。LayoutBuilder的主要作用是让子组件根据父组件的大小进行自适应布局。LayoutBuilder的作用是在子控件构建之前获取父级容器的大小,并将其传......
  • iOS 瀑布流之栅格布局
    一、效果预览二、确定需求由下面的需求示意图可知模块的最小单位是正方形,边长是屏幕宽除去边距间隔后的四等份,而每个模块的样式有小正方形(1:1)、大正方形(2:2)、横长方形(2:1)、纵长方形(1:2),动态的根据服务器下发模块样式绘制布局,可以横向滑动,限定为两行的高度。注意:上面的示意......
  • Layout()方法用于布局管理器的更新,解决panel刷新后其中控件挤作一坨的问题
    在wxPython中,Layout()方法用于布局管理器的更新。它会告诉布局管理器重新计算和调整子控件的大小和位置。一般来说,当您:-添加或删除子控件-隐藏或显示子控件-改变子控件的大小-改变容器的大小这些情况下,您需要调用Layout()方法,告诉布局管理器进行重新布局。例如,在BoxSiz......
  • 武汉星起航:高效布局亚马逊父亲节活动,跨境卖家需要考虑因素
    亚马逊作为全球最大的电商平台之一,父亲节是一个重要的销售时机。为了高效布局父亲节促销活动,卖家需要精心选择产品,以满足消费者的需求和偏好。以下是武汉星起航整理的一些选品策略和建议:考虑目标受众:父亲节是向父亲和准父亲购买礼物的时机,因此需要针对这一特定受众选择合适的产品。......
  • iOS- 快速实现展示布局
    概述比较有规律的页面,快速实现展示布局,提高开发效率.详细看到这个界面,是不是觉得不像那种比较有规律的,可以用单独tableViewCell或者xib来实现方便些的,现在我直接在C里快速实现展示布局.一、程序实现先看布局,可以分成两个分区:在数据源方法里去处理......
  • 产品布局.1(html)
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • 产品布局.2(html)
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • LYT-WPF-基础-布局-Canvas面板
    已亲测!ZIndex实例有修改之处!!!本文转自:WPF教程五:布局之Canvas面板-.NET开发菜鸟-博客园(cnblogs.com),感谢~~Canvas:画布面板画布,用于完全控制每个元素的精确位置。他是布局控件中最为简单的一种,直接将元素放到指定位置,主要来布置图面。使用Canvas,必须指定一个子元素的位置(相对......