JFX 学习笔记 八 反射

反射关键字class
System.out.println(1.class.Name) // prints "Number"
System.out.println("Hello".class.Name); // prints "String"

class X {
attribute a: Number;
}
var x = new X();
System.out.println(x.class.Name); // prints "X"
System.out.println(sizeof x.class.Attributes); // prints 1
System.out.println(x.class.Attributes[0].Name); // prints "a"
——————————————————————————————————
class X {
attribute a: Number;
}
var x = new X();
x.a = 2;
System.out.println(x[x.class.Attributes[Name == 'a']]); // prints 2
————————————————————————————————————
在JavaFX中,类的成员函数和操作本身被模式化作为在目标类中的类,而形参和返回值被表示为属性。代表目标对象的属性名是“this”。代表返回值的属性名为“return”。代表形参的属性具有和形参相同的属性名。

译者注:这里的目标类是指使用成员函数和操作的类。而目标对象则指使用成员函数和操作的对象。

从上例中可以发现,你也可以从Class对象中获取相同的、被反射的操作。

被反射的操作能够像函数那样通过将目标对象作为第一个参数、其它参数作为后面的参数的方式被调用:

import java.lang.System;

class X {
operation foo(n: Number): Number;
}

var x = new X();
var op = x.class.Operations[Name == 'foo'];
System.out.println(op(x, 100));

// the above code is equivalent to the following non-reflective code:
System.out.println(x.foo(100));

bean属性和Java类的公共字段被反射为JavaFX属性。但是,Java方法不能被反射为JavaFX操作。如果你想调用某个Java方法,那么你可以通过简单地使用Java API来实现。

注意:与Java不同的:在JavaFX中class操作符被用于表达式,而不是用于类型名(type name)。因此作为补充,JavaFX支持从类型名中获取反射类对象的语法:

:TypeName

For example:

import java.lang.System;
System.out.println(:System.Name); // prints "java.lang.System"
System.out.println(:System.class.Name); // prints "Class"

广度(Extents)和枚举
类的“广度”,即此类的所有实例的集合,能够通过以下语法获得:

*:ClassName

例如,下面的代码打印出String类的所有实例:

import java.lang.System;

for (i in *:String) {
System.out.println(i);
}

注意:这是可选特性,默认情况下是失效的。

JavaFX也提供了声明类的命名实例的能力:
objectName:ClassName

例如:

import java.lang.System;

myString:String = "This is a string";

System.out.println(myString:String);

这样的命名实例是全局可访问的,但通常必须使用类名进行限制。然而,在属性初始化程序和赋值的上下文中,表达式类型的命名实例被引入到了词法作用域(lexical scope)(可见性弱于变量和属性),并可以通过使用它们的无限定名(unqualified names)引用这些命名实例:

Button {
mnemonic: P
text: "Press Me"
}
在上面实例中,由于Button的mnemonic属性是KeyStroke类型的,因此我能够通过使用它的无限定名访问其命名值P,而在别处我将不得不使用P:KeyStroke来引用它。

JavaFX使用与Java1.5同样的语法来访问枚举类型值:

import java.lang.management.MemoryType;

var heap = HEAP:MemoryType;
var nonHeap = NON_HEAP:MemoryType;

————————————————————————————————
JFX中使用例子与部分文字说明来自于:openjfx社区,感谢他们翻译了这么多东西 :idea:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaFX中,我们可以通过添加窗口关闭事件的监听器来监视窗口关闭。通过监听窗口关闭事件,我们可以在窗口关闭之前执行一些必要的操作。 要监听窗口关闭事件,我们首先需要获取窗口的Scene对象,然后通过Scene对象获取窗口Stage对象。接下来,我们可以使用Stage的setOnCloseRequest()方法来设置一个窗口关闭事件的监听器。 例如,以下是一个简单的代码示例,演示了如何监听窗口关闭事件: ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class WindowCloseListenerExample extends Application { @Override public void start(Stage primaryStage) { primaryStage.setTitle("Window Close Listener Example"); // 创建一个按钮 Button closeButton = new Button("Close Window"); closeButton.setOnAction(event -> primaryStage.close()); // 创建一个布局,并将按钮添加到布局中 StackPane layout = new StackPane(); layout.getChildren().add(closeButton); // 创建一个场景,并将布局添加到场景中 Scene scene = new Scene(layout, 300, 200); primaryStage.setScene(scene); // 监听窗口关闭事件 primaryStage.setOnCloseRequest(event -> { // 在窗口关闭之前执行一些操作,比如保存数据或清理资源 System.out.println("Window is closing..."); }); primaryStage.show(); } public static void main(String[] args) { launch(args); } } ``` 在上面的例子中,我们创建了一个简单的JavaFX应用程序,其中包含一个窗口和一个按钮。当点击按钮时,程序会关闭窗口。同时,在窗口关闭之前,我们通过setOnCloseRequest()方法设置了一个窗口关闭事件的监听器,并在监听器中打印出一条消息。 当我们运行上述代码时,我们可以看到当点击窗口的关闭按钮时,程序会先输出"Window is closing...",然后关闭窗口。 这就是如何在JavaFX中监听窗口关闭事件的基本过程。通过监听窗口关闭事件,我们可以在窗口关闭之前执行一些必要的操作,以确保程序的正常退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值