gpt4 book ai didi

java - 如何检测用户是否更改了 JDateChooser 日期而不是其他设置日期属性的内容?

转载 作者:行者123 更新时间:2023-12-02 09:07:14 28 4
gpt4 key购买 nike

我使用JDateChooser编辑表单中的日期。

简短版本:我需要区分 JDateChooser 上的用户日期编辑编程属性更改

解决方法:我发现了一个名为 dateSelected 的 protected JDateChooser 属性。这正是我所需要的(afaics 没有 getter),所以我可能必须创建自己的扩展 JDateChooser 类并为此属性创建一个 getter。这里的问题是,我希望这个自定义版本可以从 Netbeans Palette 中拖动,而我的自定义 JDateChooser 则不能。

长版:首先,我从数据库中获取日期,然后使用 JDateChooser 的 setDate() 方法在 GUI 中设置日期。当用户使用选择器选择新日期时,我想编辑数据库的日期。为此,我监听 JDateChooser 对象上的 PropertyChange 事件(查找“日期”更改)。在数据库中设置新日期后,我想刷新数据(从数据库中获取整个记录)并从数据库中设置日期(如果有任何错误,它将设置回数据库中的任何内容)目前)。

问题是,当我从数据库设置日期时,当用户更改日期时会触发相同的事件,然后我的“刷新”机制会更新 JDateChooser 字段,并且我会出现无限循环。

我现有的(简化)代码 (netbeans):

private void dataStartuChooserPropertyChange(java.beans.PropertyChangeEvent evt) {
if ("date".equals(evt.getPropertyName())) {
JDateChooser wybieraczDat = (JDateChooser) evt.getSource();
updateDatabaseField(wybieraczDat.getDate());
}
}

最佳答案

我会在这里回复自己,因为我犯了一种疯狂的做法(这可能毫无值(value),但适合我的需要)。我不会创建一个完整的工作示例,因为我没有时间。但仍有一些人可能会受益。

检查日期是由用户选择还是在 JDateChooserPropertyChangeEvent 中以编程方式设置我检查了 JDateChooser 名为 dateSelected 的私有(private)字段。在我完成所需的操作(修改数据库)后,我将此字段设置回 false 因为否则即使再次以编程方式更改日期,它也会保持 true 。下面的示例代码(未优化,丑陋,只是为了演示我所做的)。

JDateChooser aDateChooserInstance = new JDateChooser();

// Listen for property changes
aDateChooserInstance.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
// If the 'date' property was changed...
if ("date".equals(evt.getPropertyName())) {
JDateChooser aDateChooser = (JDateChooser) evt.getSource();
boolean isDateSelectedByUser = false;
// Get the otherwise unaccessible JDateChooser's 'dateSelected' field.
try {
// Get the desired field using reflection
Field dateSelectedField = JDateChooser.class.getDeclaredField("dateSelected");
// This line makes the value accesible (can be read and/or modified)
dateSelectedField.setAccessible(true);
isDateSelectedByUser = dateSelectedField.getBoolean(aDateChooser);
} catch (Exception ignoreOrNot) {
}

// Do some important stuff depending on wether value was changed by user
if (isDateSelectedByUser) {
importantStuff();
}

// Reset the value to false
try {
Field dateSelectedField = JDateChooser.class.getDeclaredField("dateSelected");
dateSelectedField.setAccessible(true);
isDateSelectedByUser = dateSelectedField.setBoolean(aDateChooser, false);
} catch (Exception ignoreOrNot) {
}
}
}
});

关于java - 如何检测用户是否更改了 JDateChooser 日期而不是其他设置日期属性的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12681933/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com