当前位置: 首页 > 知识库问答 >
问题:

JavaFX8-自定义控件及其子控件

公良俊楚
2023-03-14

我试图使用JavaFX8创建一组自定义控件。我有点困惑什么是正确的方法来做一些事情,比如布局我定义的孩子来构建我的控件。我用来重写layoutChildren()方法,在其中重新定位和调整子元素的大小;但是阅读javadoc中的layoutChildren()是这样写的:

在布局传递期间调用,以布局此父级中的子级。默认情况下,它只将托管的、可调整大小的内容的大小设置为它们的首选大小,而不进行任何节点定位。

因此,根据文档,我不能执行子节点的任何重定位(“节点定位”)。

我试图理解的是,在自定义控件中定位和调整子控件大小的正确方法是什么。

public class MyControl extends TextField {
    private Label label;

    public MyControl() {
        super();
        setSkin(new TextFieldSkin(this));

        label=new Label("This is my custom textfield");
        getChildren().add(label);
    }

    @Override
    protected void layoutChildren() {
        super.layoutChildren();
        label.relocate(0, -label.getHeight());

        System.out.println("I'm laying out children");
    }
}

如果运行它,您将注意到layoutChildren()被称为每个帧

共有1个答案

司寇光华
2023-03-14

您误解了您引用的Javadocs,它描述了parent.layoutchilder()所做的事情。它没有说一个子类不能定位节点;事实上,下一个句子是

子类应该重写此函数来根据需要布局内容。

因此,这正是您应该重写的方法,以便布局子节点。

(*)我对其工作原理的理解是,父节点绑定到其子节点的布局边界:如果任何子节点的边界无效,则在下一个呈现脉冲时重新计算其布局。反过来,如果内容发生变化,节点将使其自己的布局边界无效(例如,如果文本发生变化,标签将使其布局边界无效,等等)。换句话说,JavaFX可观察的属性和绑定驱动布局机制。

所以(TL;DR):parent(或region,甚至pane,这取决于您需要的功能)的子类的layoutchildrement()方法正是调整子节点大小和重新定位的正确位置。如果(且仅当)父级需要重新计算其布局,则每次呈现场景时都会调用该方法。

 类似资料:
  • 我有一个由几个标签控件组成的自定义控件:日期、标题、文本等,控件有fxml文件和一个控制器。我想将此控件用作ListView的单元格。我创建了一个自定义列表单元格 但我不确定这是一个正确的做法。我的应用程序中的ListView可能有数千个项目。根据我的理解,在创建图形节点之前,每次单元格更新都必须加载fxml、进行解析和其他操作。有没有更好的办法来解决这个问题?

  • 自定义控件用JavaScript和原生平台支持的语言编写。它们使用原生Tabris.js客户端的接口,并被封装在Cordova插件中。本文将介绍JavaScript的实现部分。 用JavaScript定义自定义控件 自定义控件必须继承自Widget。它能够与自定义控件的原生部分进行通信。 自定义控件类必须覆写_nativeType属性的getter以返回与原生实现匹配的类型: class MyCu

  • PyQt5 有丰富的组件,但是肯定满足不了所有开发者的所有需求,PyQt5 只提供了基本的组件,像按钮,文本,滑块等。如果你还需要其他的模块,应该尝试自己去自定义一些。 自定义组件使用绘画工具创建,有两个基本方式:根据已有的创建或改进;通过自己绘图创建。 Burning widget 这个组件我们会在 Nero,K3B,或者其他 CD/DVD 烧录软件中见到。 #!/usr/bin/python3

  • 本文向大家介绍Android自定义控件之自定义组合控件(三),包括了Android自定义控件之自定义组合控件(三)的使用技巧和注意事项,需要的朋友参考一下 前言: 前两篇介绍了自定义控件的基础原理Android自定义控件基本原理详解(一)、Android自定义控件之自定义属性(二)。今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本。 使用自定义组合控件的好处? 我

  • Tabris.js控件由JavaScript API和原生平台的实现组成。本文档介绍Android平台上的自定义控件的原生实现。 为了实现自定义控件你需要本地构建。 在Cordova基础上构建 为了创建Tabris.js自定义控件,我们使用Cordova的构建系统。因此,我们创建一个与Tabris.js特定的API相关联的Cordova插件。Tabris.js自定义控件不需要接触任何Cordova

  • ASP.NET允许用户创建控件。 这些用户定义的控件分为: 用户控件 自定义控件 用户控制 用户控件的行为类似于微型ASP.NET页面或Web表单,可以被许多其他页面使用。 它们派生自System.Web.UI.UserControl类。 这些控件具有以下特征: 他们有.ascx扩展名。 它们可能不包含任何,或标记。 它们具有Control指令而不是Page指令。 为了理解这个概念,让我们创建一个