即使在整个NSA监视的这段时间,实现JavaFX控件时也要牢记可观察性,这仍然是一个好主意。 与Swing相比,这在JavaFX中很容易实现。

旧时光

来自Swing,我习惯于花费大量精力和时间来使自定义控件变得可观察。 通常需要添加方法来添加和删除某种类型的侦听器。 此侦听器类型是一个新接口,该接口的单个​​方法接受了一个新的事件对象。 要发送此事件对象,控件必须在我的自定义控件中“触发”它,因此我最终编写了fireXYZ()方法。 要做很多工作只是为了让别人知道控件状态的某些方面已经改变。

新时代

在JavaFX中,通过使用属性和可观察的集合可以更轻松地实现可观察性。 在FlexGanttFX框架中,其控件的几乎每个属性都是属性,并且所有集合都是通过FXCollections类创建的,该类返回可观察的集合。 这很有意义,因为每个控件的属性总数定义了它的状态,并且该状态必须是可观察的,以便应用程序的其他部分(尤其是其他控件)可以对状态更改做出反应。

样板代码

使用属性的不利之处在于,您最终编写了许多样板代码,但仍然比Swing少。 如果是布尔型属性,它将如下所示:

public final BooleanProperty showStuff =new SimpleBooleanProperty(this, "showStuff", true);public final BooleanProperty showStuffProperty() {return showStuff;
}public final boolean isShowStuff() {return showStuff.get();
}public final void setShowStuff(boolean show) {showStuff.set(show);
}

是的,您应该完全遵循此编码约定。 对于名为xxx的属性,请提供名为xxxProperty()的属性访问器方法,名为setXXX()的设置器和名为getXXX()的获取器。 这是在JavaFX中使用它的方式,您应该坚持使用它。

使用集合时,通常至少会得到以下代码:

private final ObservableList<String> names =FXCollections.observableArrayList();public final ObservableList<String> getNames() {return names;
}

在JavaFX核心控件中,集合通常存储在一个属性中,以便可以用新集合替换整个集合。 到目前为止,我在控件中还没有真正看到对此的强烈要求,也没有这样做,这意味着我不必为此情况编写属性侦听器。

听众

现在,我们的控件属性是属性,我们可以通过向它们添加侦听器(使用lambda表达式)来轻松地对状态更改做出反应。

myControl.showStuffProperty().addListener(it -> showStuffChanged());myControl.getNames().addListener((Observable observable) -> namesChanged());

结论

在设计自己的自定义控件时,通过属性和可观察的集合在控件类中公开其状态。 这样,每个人都将能够以与整个JavaFX框架一致的方式观察控件的状态,并使其他开发人员能够无缝地将其控件/应用程序与您的控件集成在一起。

翻译自: https://www.javacodegeeks.com/2014/07/javafx-tip-5-be-observable.html

JavaFX技巧5:可观察相关推荐

  1. JavaFX技巧来节省内存! 属性和可观察物的阴影场

    在 JavaFX的世界中, Properties API允许UI开发人员将值绑定到UI控件. 这种功能非常容易,但是当对象模型经常使用属性时,应用程序可能会很快耗尽内存. 我通常会编写两个单独的对象, ...

  2. JavaFX技巧17:带有AnchorPane的动画工作台布局

    最近,我不得不为应用程序实现一个布局,其中可以根据用户是否登录来隐藏或通过滑入/滑出动画显示或显示菜单区域和状态区域. 以下视频显示了实际的布局: 在过去,我可能会使用自定义控件和自定义布局代码来实现 ...

  3. JavaFX技巧23:节省内存! 属性的阴影场

    Java 8中引入的属性和属性绑定是非常有用的编程概念. 当您开发用户界面时,它们特别有用. 实际上,它们是如此有用,以至于开发人员成为所有事物都应该是属性而不是原始属性的想法的受害者. 不幸的是,他 ...

  4. JavaFX技巧11:更新只读属性

    自定义控件通常具有"只读"属性. 这意味着不能从控件外部进行设置,甚至不能从自己的皮肤类别进行设置. 通常,控件的行为会导致更改只读属性. 在JavaFX中,可以在控件本身和皮肤中 ...

  5. JavaFX技巧4:总结

    在为JavaFX开发自定义控件时,我强烈建议您遵循JavaFX核心控件的脚步,并使控件的API尽可能最终化,并在所有方法声明的前面放置" final"关键字. 例 在FlexGan ...

  6. JavaFX技巧32:需要图标吗? 使用Ikonli!

    动机 自2013年以来,我一直在编写JavaFX应用程序和库的代码,它们的共同点是,我需要找到可以用于它们的良好图标/图形. 作为前Swing开发人员,我首先使用图像文件,GIF或PNG. 通常,我会 ...

  7. JavaFX技巧31:遮罩/剪切/ Alpha通道

    选择条 最近,我不得不实现一个自定义控件,该控件使用户可以从项目列表中选择一个项目. 此" SelectionStrip"控件必须水平放置项目,并且在项目过多的情况下,允许用户左右 ...

  8. JavaFX技巧30:带有DropShadow的ScrollPane

    最近,在我的一个项目中,我发现用户很难看到ScrollPane实例的内容当前是否已滚动. 一种更清晰的方法是在滚动窗格的顶部添加阴影. 这也是Google的Material Design建议的. 所以 ...

  9. JavaFX技巧29:使布局忽略不可见的节点

    在我仍在Swing中实现UI的时候,我曾经是MigLayout的忠实拥护者("一个布局管理者来统治所有这些,对吗Mikael?"). 我真正喜欢的功能之一是当组件不可见时可以定义不 ...

最新文章

  1. 争议中挺进全新里程——中国“超级对撞机”《概念设计报告》发布侧记
  2. java export命令_Linux 命令详解(一)export 命令
  3. OpenCV使用cv :: CascadeClassifier类检测视频流中的对象的实例(附完整代码)
  4. 背水一战 Windows 10 (15) - 动画: 缓动动画
  5. docker添加jar包_docker配置容器运行jar包
  6. python天天向上每十天休息一天_Python基础第十天
  7. FAILED: Error in metadata: MetaException(message:Got exception: java.net.ConnectException
  8. javaone_JavaOne 2012覆盖率
  9. [转载] 民兵葛二蛋——第27集
  10. 金蝶k3财务接口_记录用友T+接口对接的心酸历程
  11. Postman图片上传用法以及Required request part file is not present的解决方法
  12. 柯马机器人示教器编程_CR 17911080,COMAU柯马机器人示教器 ,编程器更换显示器维修...
  13. 关于android输入框被键盘遮挡的问题
  14. cookiecutter笔记
  15. 手机无法被计算机识别,手机usb无法被电脑识别怎么办_电脑无法识别手机usb设备的解决方法...
  16. 一文读懂CRNN+CTC文字识别
  17. 利用中央气象台的天气预报API实现天气预报
  18. 今天开始学Java 明明想在学校中请一些同学一起做一项问卷调查
  19. 全球及中国工程机械行业销售规模与投资竞争力研究报告2022版
  20. matlabR2016a 所适用的psat工具包

热门文章

  1. pycharm 的version controller
  2. java弹弹球实验报告_Java弹球游戏实验报告—chen
  3. 反射、HashMap、ArrayList与LinkedList区别
  4. 利用 GregorianCalendar 制作当前月的月历
  5. oidc auth2.0_将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成
  6. cognito_将Spring Boot应用程序与Amazon Cognito集成
  7. apache isis_使用Apache Isis快速进行SEMAT应用程序开发
  8. swarm 和 k8s_Wildfly Swarm,朝着成熟和一小部分贡献
  9. nio2和nio2_列出和过滤NIO.2中的目录内容
  10. 使用@JsonIdentityInfo的Spring自定义序列化器