有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

解决方法:我发现了一个名为dateSelected的受保护JDateChooser属性,这正是我所需要的(因为没有getter),所以我可能必须创建自己的扩展JDateChooser类,并为此属性创建一个getter。这里的问题是,我想让这个自定义版本可以从Netbeans调色板中拖动,而我的自定义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());
    }
}

共 (2) 个答案

  1. # 1 楼答案

    我会在这里回答我自己,因为我找到了一种疯狂的方式来做这件事(这可能是毫无价值的,但对我的需求来说很好)。我不会创建一个完整的工作示例,因为我没有时间。还有一些人可能会受益

    要检查日期是由用户选择的还是在JDateChooserPropertyChangeEvent中通过编程设置的,我检查JDateChooser的名为dateSelected的私有字段。在我做了任何需要的事情(修改数据库)之后,我将这个字段设置回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) {
                }
            }
        }
    });
    
  2. # 2 楼答案

    我正在使用ActionListener

    fr.getFirstDate().getCalendarButton().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fr.getSeconDate().setEnabled(true);
            }
        });