只有当用户完成修改文本小部件时,我才能触发事件吗?

Posted

技术标签:

【中文标题】只有当用户完成修改文本小部件时,我才能触发事件吗?【英文标题】:Can I fire event only when user finishes modifying Text widget? 【发布时间】:2014-10-30 17:37:25 【问题描述】:

我有一个 SWT Text 控件。我试图弄清楚如何在用户完成修改控件时进行监听,即它被修改然后被标记出来。我不希望每次文本框中的字符更改时都调用我的侦听器,也不希望在用户遍历页面上的字段时调用它。我只在用户修改然后离开控件时才想要它。

我查看了可用于Text 控件的各种侦听器,但除非我遗漏了什么,否则我看不到任何类似的东西。我错过了吗?

【问题讨论】:

【参考方案1】:

在获得焦点时将文本内容保存到变量中,然后在失去焦点时将其与最新文本进行比较 - 如果不同,则修改文本,否则不修改。

不会在每次字符更改时调用此侦听器。

如果您只是简单地遍历控件(使用 TAB 键),那么您也可以检测文本是否更改。

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class Snippet19 
    private static String temp = "";

    public static void main(String[] args) 
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new GridLayout());
    final Text text = new Text(shell, SWT.BORDER);
    text.setLayoutData(new GridData());
    text.addFocusListener(new FocusListener() 

        @Override
        public void focusLost(FocusEvent e) 
            if (temp.equals(text.getText())) 
                System.out.println("Text not modified");
             else 
                System.out.println("Text conent modified");
            

        

        @Override
        public void focusGained(FocusEvent e) 
            temp = text.getText();

        
    );
    final Text text1 = new Text(shell, SWT.BORDER);
    text1.setText("chandrayya");
    text1.setLayoutData(new GridData());
    final Text text2 = new Text(shell, SWT.BORDER);
    text2.setText("chandrayya");
    text2.setLayoutData(new GridData());
    shell.open();
    while (!shell.isDisposed()) 
        if (!display.readAndDispatch())
            display.sleep();
    
    display.dispose();
    

【讨论】:

我喜欢这个主意。我分心于另一个项目,但当我回到它时,我一定会尝试这个。【参考方案2】:

听起来您正在寻找FocusListenerText 控件从 Control 继承 addFocusListener() 等,因此请查看其 API 文档的继承方法部分。

【讨论】:

以上是关于只有当用户完成修改文本小部件时,我才能触发事件吗?的主要内容,如果未能解决你的问题,请参考以下文章

从自动完成中选择的事件

选择选项卡小部件时如何连接事件?

如何在自定义元素或按钮小部件上触发事件?

CKEditor 5如何从任何小部件/模型/视图中获取单击,更新和删除的事件

如何收听组小部件(Java SWT)的文本修改事件?

事件类型--键盘与文本事件