JavaFX自定义节点开发

本文介绍了JavaFX中自定义节点的实现方法,并通过两个实例展示了如何创建简单的自定义图形节点及具备交互功能的复杂节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在JavaFX开发中,建立一个自定义节点非常普遍;而且jfx中的自定义节点功能也很强大。下面我简单介绍两个自定义节点的例子。

 

先看代码:

class Bars extends CustomNode {
    override function create():Node {
        return Group {
            content: for(x in [0..4]) {
                Rectangle {
                    y: indexof x * 20
                    width: 100
                    height: 10
                    fill: Color.RED
                }
            }
        };
    }
}

Stage {
    title: "CustomNode Basic"
    width: 350
    height: 200
    scene: Scene {
        content: [
            Bars { }
        ]
    }
}

 

结果显示:


jfx自定义节点实现起来比较简单,就是需要继承CustomNode,然后重写create方法。由于create方法返回的是一个节点,那么我们再使用就比较简单了,和其他jfx下的图形节点基本用法是一样的。下面我们再做一个稍微复杂点的例子。

 

先看代码:

var num = 10.0;

Stage {
    title: "NumberBox"
    width: 250
    height: 280
    scene: Scene {
        content: VBox{
            translateX: 20
            translateY: 20
            content: [
                Slider {
                    min: 0
                    max: 100
                    value: bind num with inverse
                }
                NumberBox{
                    value: bind num 
                }
            ]
        }
    }
}


class NumberBox extends CustomNode {

    public var value;

    public override function create(): Node {
        TextBox {
            columns: 12
            selectOnFocus: true
            text: bind value.toString()
        }
    }
}

 

Java Web Start方式运行

 

结果显示 :


这次我们在自定义节点中添加了一个公用变量value,在使用节点的时候就可以为这个变量赋值,当我们把value和滑块(Slider)中的value值相互绑定(bind)就产生了上面的效果。其实自定义节点功能很强大,在节点中还可以添加各种效果(effect)、动画、事件等等。

 

 

 

 

### 创建和使用 JavaFX 自定义控件 #### 定义自定义控件类 为了创建一个新的自定义控件,在 `javafx.scene.control` 包下继承 `Control` 类是一个常见的起点。通过这种方式,能够确保新组件具有与内置控件一致的行为模式并能良好集成到现有的布局管理器中。 ```java public class MyCustomControl extends Control { static { // 加载样式表以支持外观定制化 MyCustomControl.class.getResource("mycustomcontrol.css").toExternalForm(); } @Override protected Skin<?> createDefaultSkin() { return new MyCustomControlSkin(this); } } ``` 此代码片段展示了如何构建基础结构来容纳新的UI逻辑[^1]。 #### 实现皮肤(Skin)机制 对于复杂交互需求较高的场景,则需进一步实现对应的 `Skin` 接口实例用于描述具体绘制细节以及处理事件响应等功能模块: ```java class MyCustomControlSkin implements Skin<MyCustomControl> { private final MyCustomControl control; public MyCustomControlSkin(MyCustomControl control){ this.control = Objects.requireNonNull(control,"Control cannot be null"); // 初始化节点树... } @Override public void dispose(){ // 清理资源... } @Override public Node getNode(){ // 返回代表该控件视图层次根部的Node对象. return ... ; } @Override public MyCustomControl getSkinnable(){ return control; } } ``` 上述做法允许开发者分离业务逻辑同表现形式之间的耦合关系,从而提高代码可维护性和重用率[^4]。 #### 使用 CSS 进行美化调整 除了编程方式外,还可以借助于外部样式文件(`.css`)来进行视觉上的优化工作。这不仅简化了开发流程而且增强了灵活性: ```css /* mycustomcontrol.css */ .my-custom-control .inner-part{ -fx-background-color:red; /* 设置背景颜色为红色 */ -fx-padding: 5px; /* 添加内边距 */ } ``` 最后一步就是将这些规则应用至目标元素上即可完成整个过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值