【问题标题】:Check multiple elements with a single listener使用单个侦听器检查多个元素
【发布时间】:2019-04-28 03:54:44
【问题描述】:

我正在尝试创建一个电子邮件客户端。这是我打开程序时的输出:

如您所见,唯一启用的按钮是全部回复。这是因为我无法转发或回复未选中的电子邮件,但我可以回复列表中的所有电子邮件。然后,如果我删除所有电子邮件,这是输出:

所有按钮都被禁用(这是正确的)。现在,如果我通过按 Cambia Account 更改帐户,将生成一个新的电子邮件列表,但不会启用 Reply-All 按钮。我猜这是因为侦听器只检查当前邮件的状态,而不检查是否有它们的列表。我该如何解决?

这是管理我禁用按钮的部分的代码:

public void initModel(DataModel model) {
    if (this.model != null) {
        throw new IllegalStateException("Model can only be initialized once");
    }
    this.model = model;
    model.currentEmailProperty().addListener((obs, oldEmail, newEmail) -> {
        if (oldEmail != null) {
            reply.setDisable(false);
            forward.setDisable(false);
            replyall.setDisable(true);
        }
        if (newEmail == null) {
            reply.setDisable(true);
            forward.setDisable(true);
            replyall.setDisable(true);
        } else {
            reply.setDisable(false);
            forward.setDisable(false);
            replyall.setDisable(false);
        }
    });
}

【问题讨论】:

  • 监听器中第一个if的目的是什么?所有执行路径的属性值在第二个if 中被覆盖。
  • 第一个 if 是当我有一个电子邮件列表但没有一个被选中时进行管理。
  • 在 dataModel 中对启用/禁用状态进行建模,然后绑定到视图状态。无论如何,请提供一个 minimal reproducible example 来说明问题。

标签: java list button javafx observable


【解决方案1】:

如果您的replyall 按钮的禁用状态取决于列表是否有项目,您为什么要在currentEmailProperty 侦听器中更改它?您应该听取对列表的更改并在那里进行更新。

【讨论】:

  • 我不能这样做,因为我无法通过按钮控制器控制列表
  • 你应该研究一下如何在 JavaFX 中的控制器之间进行通信
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多