我可以仅在用户完成修改Text小部件时触发事件吗?

时间:2014-09-05 17:54:54

标签: java swt listener

我有一个SWT Text控件。我试图弄清楚当用户完成修改控件时如何监听,即它被修改然后标签出来。我不希望每次角色在文本框中发生变化时都会调用我的监听器,当用户遍历页面上的字段时,我不希望它被调用。我只想在用户修改然后离开控件时才想要它。

我已经查看了Text控件可用的各种听众,但除非我遗漏了某些内容,否则我看不到这样的内容。我错过了吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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();
    }
}