当前位置: 首页 > 知识库问答 >
问题:

除非ObjectProperty的源更改,否则ChangeListener不会被触发

昝欣可
2023-03-14

使用JavaFX8,如果ObjectProperty的一个属性发生更改,但引用保持不变,那么如何能够得到通知?

下面是使用ObjectProperty的具体示例

public abstract class EntityController {
    protected ObjectProperty<KeyStore> trustStore = new SimpleObjectProperty<KeyStore>();

    public EntityController() {

    }

    public KeyStore getTrustStore() {
        return this.trustStore.getValue();
    }

    public void setTrustStore(KeyStore trustStore) {
        this.trustStore.set(trustStore);
    }

    public ObjectProperty<KeyStore> trustStoreProperty() {
        return this.trustStore;
    }


}
public class CertificatesTabPresenter extends PKIPresenter implements Initializable {

    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {
            this.getEntityController().trustStoreProperty().addListener((observableVal, oldTrustStore, newTrustStore) -> {
            trustStoreChanged(oldTrustStore, newTrustStore);
        });
    }


    @FXML
    private void addTrustStore(MouseEvent e) {
        File keyStoreFile = selectKeyStoreFile();
        if (keyStoreFile != null) {
            Optional<String> keyStoreType = selectKeyStoreType();
            if(keyStoreType.isPresent()) {
                Optional<char[]> password = insertPassword();
                if(password.isPresent()) {
                    try {
                        KeyStore trustStore = KeyStore.getInstance(keyStoreType.get());
                        trustStore.load(null, null);

                        FileInputStream fis = new FileInputStream(keyStoreFile);
                        trustStore.load(fis, password.get());


                        //This causes the changeListener to be notified because the reference changed
                        this.getEntityController().setTrustStore(trustStore);


                        //The changeListener won't be notified, because only the KeyStore changes internally but the reference stays the same
                        trustStore.deleteEntry(trustStore.aliases().nextElement());
                        this.getEntityController().setTrustStore(trustStore);
                        //This also won't notify the changeListener
                        String a = this.getEntityController().getTrustStore().aliases().nextElement();
                        this.getEntityController().getTrustStore().deleteEntry(a);


                    } catch (KeyStoreException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } catch (FileNotFoundException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } catch (NoSuchAlgorithmException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } catch (CertificateException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } catch (IOException e1) {
                        //TODO: password was wrong -> show error message
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            }
        }
    }
}

相关代码是第一次设置ObjectProperty的值并随后删除一个元素的位置。change eListener仅在设置ObjectProperty的值时收到通知,但在值更改时不会收到通知。

我的问题是:即使引用的对象没有更改,如果密钥库得到更新,我如何获得通知?JavaFX中是否有内置方式?

我的目的是在changeListener中每次向密钥库添加或删除证书时,在列表视图中显示所有包含的证书和密钥,并更新列表视图。也许我完全走错了路,我应该做完全不同的事?

其他信息:

this.getEntityController()

返回本身保存在ObjectProperty中的EntityController的实例

共有1个答案

曹均
2023-03-14

我不知道有什么更好的方法来处理这个限制,所以我要做的就是对修改后的对象执行set(),这样引用保持不变,但更改会传播。

 类似资料:
  • 我按照设置TwitterSource和HDFS汇的链接。 用于启动代理的命令: 我成功地做到了这一点,但现在有一个问题。在停止flume代理之前,输出不会被写入。一旦我杀了我的水槽代理,它就会被写到HDFS。 我有两个问题: 1)如何停止水槽剂 - 除了做CTRL C之外,还有其他方法吗? 2)我能让flume-agent在移动中向HDFS写信,而不必杀死代理吗? 注意:终止进程后,写入的文件。t

  • 当bean是POJO时,Weld说“对类型Foo的不满意的依赖关系”是什么意思,但是,只要我在顶部添加< code>@Dependent,一切都工作正常?我记得以前不用指定作用域也能很好的工作。我想我打碎了什么东西。 说明书上说: 托管 Bean 由 Java 类实现,该类称为其 Bean 类。如果顶级 Java 类被任何其他 Java EE 技术规范(如 Java 服务器人脸技术规范)定义为受管

  • 问题内容: 这是我的配置: 根据此处找到的logback文档(http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy),文件将根据我的fileNamePattern 每分钟翻转一次。 我观察了它是如何工作的,这是我的发现: 它不会在很短的时间内创建日志文件。 当新日志到达时,它只会为前一分钟创建一个日志文件。(例如,我在

  • 正如标题所说,我根本无法让Quartz.net工作。我从NuGet获得了最新版本的Quartz.net(2.2.1)、Common.Logging(2.1.2)、Common.Logging.NLog(2.0.0)和NLog(2.1.0)。触发器没有被触发,而且石英绝对没有记录任何东西。我猜我搞砸了配置。 我的应用程序配置: 有一个作业和一个触发器与之相关: 调度程序将启动,作业和触发器将正确添加

  • 问题内容: 好的,所以我有一个监视线程,该线程检查ArrayList的大小,并在该大小大于某个数字之后执行一些操作。我现在遇到的问题是,除非我的循环中有打印语句,否则大小值永远不会更新。这是一些代码来显示我到底要做什么。 上面的代码不起作用。它永远不会进入if语句。但是,这很好用: 编辑:getSize()代码: 注意:我有另一个正在运行的线程正在更新并添加到我的t类中的列表中。 有什么帮助吗?当

  • 我对可缓存批注的条件有问题。 从文档中,我了解到除非条件在被注释的方法被调用后得到验证,并且只有在不满足除非条件的情况下,方法返回的值才会被缓存(并实际返回)。否则,应返回缓存的值。 首先,这个假设是否正确? 编辑: [来自Spring文档]顾名思义,@Cacheable用于划分可缓存的方法-即,将结果存储到缓存中的方法,因此在后续调用(使用相同的参数)时,缓存中的值将返回,而不必实际执行该方法。