【问题标题】:Notify a JButton to know which was changed通知 JButton 以了解更改的内容
【发布时间】:2016-06-26 06:54:10
【问题描述】:

我为组件上的每个更新操作创建了单独的存储过程。

这里是存储过程:

updateCurriculumName() --call only if name was changed
updateCurriculumYearLevel() --call only if year level was changed
updateCurriculumSchoolYear() -- call only if school year was changed
updateCurriculumDescription() -- call only if description was changed
updateCurriculumSubjects() -- call only if there are changes made on assigned subjects

我需要能够通知SAVE 按钮,让它知道哪个组件被修改/更改,以便它知道要调用哪个过程而不是调用所有过程。

例如,如果只更改课程名称,那么它应该只调用updateCurriculumName() 过程。

请注意,如果对 JTextField 或 JComboBox 或 JTextArea 进行了更改,我会用 * 标记 JLabel 的文本。

我现在有,

DocumentListener 代表课程名称 JTextField(添加了*)

ItemStateChangedListener 代表年级 JComboBox(还添加了*)

ItemStateChangedListener 代表学年 JComboBox(还添加了*)

如何告诉 SAVE 按钮的 actionPerformed 指令“仅”调用状态/值已更改的组件的存储过程?

喜欢,

private void SaveJbtnActionPerformed(java.awt.event.ActionEvent evt) {

if(yearlevel was changed)
call updateYearLevel()
else if(curriculumName was changed)
call updateCurriculumName()
else if(schoolyear was changed)
call updateCurriculumSchoolYear() 

}

如果您有任何关于哪种方法最好的建议或建议,我将不胜感激。

提前致谢。

【问题讨论】:

  • 一种方法是为每个过程存储一个布尔值。当对应的数据发生变化时,将其改为true。单击按钮时,只执行xDataChanged 为true 的程序。

标签: java swing jdbc actionlistener


【解决方案1】:

有一些选项可以这样做:

  1. 为按钮添加监听器,并为每个过程添加布尔值:

    mSaveBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (updateName) {
                updatename();
            }
    
            if (updateYearLevel) {
                 updateYearLevel();
            }
    
            ...
        }
    });
    
  2. 您可以创建一个自定义的save 按钮,并在按钮被触发时将布尔值传递给按钮:

    public class SaveBtn extends JButton {
    
        public SaveBtn(final boolean updateName, final boolean   
        updateYearLevel...) {
    
            if (updateName) {
                updatename();
            }
    
            if (updateYearLevel) {
                updateYearLevel();
            }
    
            ...
    
        } 
    }
    

【讨论】:

    【解决方案2】:

    我会为视图的每个相关分区或整个视图本身创建一个对象。将所有相关变量以及相关的 getter 和 setter 放入其中。

    例如:

    class ViewObject{
          private String curriculumName;
          public void setCurriculumName(String curriculumName){...}
          public String getCurriculumName(){...}
          //...and so on
    }
    

    将此对象用作控制器/模型和视图之间的传输对象。因此,例如在加载/创建视图时加载包含数据的初始版本或空版本(取决于用例)。之后,用户修改视图中的字段,当用户单击保存时,将视图的值放入其中并将其传递给保存/处理组件。 如果知道确切更改的内容比创建一个新的更重要,请在单击保存时保存视图数据并将其与初始数据进行比较。

    我确信这种方法会大大降低您的程序的复杂性,并且它将使您免于未来与视图和逻辑之间紧密绑定相关的麻烦,因此视图和控制器。

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多