通知 JButton 以了解更改的内容

Posted

技术标签:

【中文标题】通知 JButton 以了解更改的内容【英文标题】:Notify a JButton to know which was changed 【发布时间】: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。单击按钮时,只执行xDataChangedtrue 的程序。 【参考方案1】:

有一些选项可以这样做:

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

    mSaveBtn.addActionListener(new ActionListener() 
        @Override
        public void actionPerformed(ActionEvent e) 
            if (updateName) 
                updatename();
            
    
            if (updateYearLevel) 
                 updateYearLevel();
            
    
            ...
        
    );
    

    您可以创建一个自定义的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

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

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

【讨论】:

以上是关于通知 JButton 以了解更改的内容的主要内容,如果未能解决你的问题,请参考以下文章

ue4的按钮怎么执行点击事件

使用 JButton 更改 ImageBackground?

检测通知何时出现(来自其他应用程序)以更改我的布局

以编程方式定义通知内容扩展的高度

使用 JButton 在 Java 中创建自定义按钮

在 500 毫秒内更改 JButton 颜色