SWT Anonyme Eventlistener wegräumen?

Bernd Hohmann

Top Contributor
Ich muss manchmal global bestimmte KeyEvents abfangen und setze dafür im swt-Display einen Filter wie folgt:

Code:
	shlIPTC = new Shell(getParent(), getStyle());
	[...]
	shlIPTC.getDisplay().addFilter(SWT.KeyDown, new Listener() {
		public void handleEvent(Event e) {
			[....]
		}
	});

Mein Problem: wenn die Shell disposed wird, bin ich damit aber nicht den Filter im Display los. Dh. bei jeder Taste wird noch der alte Filter aufgerufen der eigentlich nicht mehr existiert.

Meine Fragen:

1) gibt es eine handliche Lösung solche "Anonymen Filter" zu entfernen?
2) gibt es eine Möglichkeit, key-events der aktuellen Shell abzugreifen ohne mit Display zu arbeiten?

Vielleicht hat jemand einen Tip aus der Praxis für mich - ansonsten muss ich den Display-Filter halt anders bauen und im SWT.Close wieder entfernen.

Bernd
 

Sonecc

Gesperrter Benutzer
Der Listener lässt sich nur mittels dessen Instanz entfernen, also indem du z.B. eine Variable erstellst, die ihn enthält (statt ihn direkt als Argument zu übergeben).

Du solltest aber auch auf der shell direkt einen Key Listener anhängen können, der die Key Events abfängt.
 

Bernd Hohmann

Top Contributor
Du solltest aber auch auf der shell direkt einen Key Listener anhängen können, der die Key Events abfängt.

Ich hab unten mal ein Testprogramm angehängt. Der Keylistener auf der Shell wird nur aufgerufen, wenn der Focus ausserhalb des Textfeldes ist.

Bernd

Java:
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;

public class EventTest {

	protected Shell shell;
	protected Text txtInput;
	protected Label lblInput;
	protected Label lblOutput;
	protected Label lblOut;

	public static void main(String[] args) {
		try {
			EventTest window = new EventTest();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void open() {
		Display display = Display.getDefault();

		//----------------------------------------------------
		shell = new Shell();
		shell.setSize(335, 153);
		shell.setText("SWT Application");
		// ###
		txtInput = new Text(shell, SWT.BORDER);
		txtInput.setBounds(84, 10, 75, 27);
		// ###
		lblInput = new Label(shell, SWT.NONE);
		lblInput.setBounds(10, 10, 72, 17);
		lblInput.setText("Eingabe:");
		// ###
		lblOutput = new Label(shell, SWT.NONE);
		lblOutput.setBounds(10, 59, 56, 17);
		lblOutput.setText("Output");
		// ###
		lblOut = new Label(shell, SWT.NONE);
		lblOut.setBounds(84, 59, 233, 17);
		lblOut.setText(".");
		//----------------------------------------------------
		shell.addListener(SWT.KeyDown, new Listener() {
			@Override
			public void handleEvent(Event e) {
				lblOut.setText(e.keyCode + "");
			}
		});
		txtInput.setFocus();
		//----------------------------------------------------

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

Sonecc

Gesperrter Benutzer
Ja, das ist relativ logisch. Die Shell fängt natürlich nur dann ein KeyEvent wenn sie auch den Fokus hat.
Dann wüsste ich auf die schnelle auch keinen besseren Weg als das nutzen des Displays.
Eine saubere Möglichkeit den Listener zu entfernen wäre es deiner Shell einen Dispose Listener anzuhängen der dann die von ihr benötigten Key Listener wieder entfernt.
Dennoch wirst du auch dort die Listener Instanz brauchen, weswegen sie weiterhin als Variable existieren sollte.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben