JavaFX 组合框 : difference between methods of adding listeners/event handlers

标签 java combobox javafx javafx-8

我正在使用 ComboBox 和 ChoiceBox 控件,并且一直在尝试找出在选择项目时执行操作的方法之间的区别。以下有什么区别?

ComboBox<String> comboBox = 
  new ComboBox(
    FXCollections.observableArrayList(
      "Hi", 
      "Hello", 
      "Test");

comboBox.getSelectionModel().selectedItemProperty().addListener(
  (observable, oldValue, newValue) -> System.out.println(newValue));

comboBox.valueProperty().addListener(
  (observable, oldValue, newValue) -> System.out.println(newValue));

comboBox.setOnAction(
  event -> System.out.println(comboBox.getValue()));

ChoiceBox 没有 onAction 属性,但它有其他属性,两者似乎做同样的事情。推荐哪个,有什么区别?

我也想知道ComboBox是设置StringConverter好还是CellFactory好; ChoiceBox 需要使用 StringConverter,但我一直在使用 setCellFactory(Callback<ListView<T>, ListCell<T>>)我的 ComboBoxes 的方法(至少有一个是必需的,因为内部标签将 ImageViews 设置为图形)。

最后一件事——我的应用程序中有许多“刷新”方法,它们在执行某个操作时运行(例如,从 ComboBox 或 ChoiceBox 中选择一个项目)。改用绑定(bind)会更好吗?我不太确定这是否可行,因为我的代码没有使用包装值(属性/ObservableValue)。

我尝试寻找这些问题的答案,但我还没有完全找到。

最佳答案

OnAction 处理程序处理事件:这意味着您可以通过调用 consume() 来停止事件的传播。不会调用基于此事件的其他监听器(取决于它是 EventHandler 还是 EventFilter,请参阅 DOM 3 事件模型,了解捕获阶段和冒泡阶段之间的差异)。

对于基于属性的监听器,您根本无法轻松做到这一点。

CellFactory 还是 StringConverter?它们的行为不尽相同,因此您应该决定什么最适合您。如果您不接触组件,也许最好只使用转换器?或者您可能只想在您的项目中使用一种技术,以便更轻松地进行演化和维护?您决定。

绑定(bind)还是手动刷新?视情况而定。您想要一直同步更新还是只是“按需”更新?绑定(bind)很棒,但是在两次更新之间添加行为会变得很困难,而且有时很难调试。 “简单胜过聪明”应该适用。

关于JavaFX 组合框 : difference between methods of adding listeners/event handlers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23900336/

相关文章:

java - 从 UI 向组合框添加值?

java - 在ListView中显示文件名并存储文件路径

java - JVM堆不断增加。为什么?

java |整数方法 |我需要 ELSE {不返回任何内容}

vba - 如何在Excel VBA中将项目添加到表单中的组合框?

mysql - 无论我做什么,Vaadin的combobox.select()都不起作用

JavaFx - 执行框架到组合框的操作

java - 如何从在不同类中运行的 TimerTask 更新 JavaFX 应用程序线程?

java - JSTL 无法解决错误

java - Ant:以编程方式创建 JUnit 报告任务