SWT将KeyListener添加到显示中

时间:2014-05-19 13:35:43

标签: java filter swt keylistener

我想将KeyListener添加到现有窗口。我想抓住3个KeyDown' s。在第一个KeyDown上,我想把一些东西放在一个Combo中。在第二个KeyDown上,我想把东西放在另一个Combo中。如果两个文本框都已填满,我希望下一个KeyDown模拟OK按钮。

但我遇到了错误小部件的问题。因为我不知道何时删除过滤器正确。只有当我再次打开窗户时才会发生这种情况!

我的代码:

_disp.addFilter(SWT.KeyDown, new Listener() {

    public void handleEvent(Event e) {
        if(!_disp.isDisposed()){
            _disp.removeFilter(SWT.KeyDown, this);
        }

        if (e.keyCode == SWT.CR) {
            if (_cmbCCID.getText().isEmpty()) {
                _cmbCCID.setText(_lastFiveCCID[0]);
            } else if (_cmbDescription.getText().isEmpty()) {
                _cmbDescription.setText(_lastFiveComment[0]);
            } else if (!_cmbCCID.getText().isEmpty() && !_cmbDescription.getText().isEmpty()) {
                _btnOk.notifyListeners(SWT.Selection, new Event());
            }
        }
    }
});

1 个答案:

答案 0 :(得分:0)

第一次按键后,您将移除过滤器。尝试这样的事情:

public static void main(String[] args)
{
    final Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new FillLayout());

    new Text(shell, SWT.NONE);

    display.addFilter(SWT.KeyDown, new Listener()
    {
        int i = 0;

        @Override
        public void handleEvent(Event arg0)
        {
            if (i < 2)
                System.out.println("Press " + i);
            else
            {
                System.out.println("Press " + i);
                System.out.println("Remove");
                if (!display.isDisposed())
                    display.removeFilter(SWT.KeyDown, this);
            }

            i++;
        }
    });

    shell.pack();
    shell.open();
    while (!shell.isDisposed())
    {
        while (!display.readAndDispatch())
        {
            display.sleep();
        }
    }
}

它会在第三次按键事件后删除过滤器。