wenn window.setVisible(false) ist,kann man keyEvent einlesen?

Tomazad

Grünschnabel
Hallo,kann jemanden mir helfen,wenn ich ein Fenster habe und dies ist nicht Visible ist,trotzt allem KeyEvent abfangen,oder nicht.
Ich will ein Fenster unhide haben,aber über Fenster die KeyEvent einlesen!!
hier ist mein code:
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.Frame;




public class HelloWorld extends Frame implements KeyListener{

/**
*
*/
private static final long serialVersionUID = 1L;
/**
*
*/

/**
* @param args
*/
public HelloWorld()
{
this.addKeyListener(this);
TextArea feld=new TextArea();
feld.setBounds(50,50,20,20);
this.add(feld);
feld.addKeyListener(this);




}
public static void main(String[] args) {
// TODO Auto-generated method stub
HelloWorld window= new HelloWorld();
window.setTitle("HelloWorld");
window.setSize(300,300);
window.setResizable(true);
window.setVisible(false);

}

public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
System.out.println("keyTyped");
}
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
System.out.println("keyPressed");
}
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub

}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

}

}
 
Hallo Tomazad,

mit setvisible(false) wird es nicht funktionieren, da der Keylistener nur funktioniert wenn die Komponente den Fokus hat.

Ein Trick wäre das Fenster aus den Grenzen des Bildschirms zu verschieben. So würde man das Frame nicht mehr sehen, du könntest aber dennoch weiterhin in das TextArea schreiben. Mit einem ShortCut würdest du das Fenster wieder holen. Wenn du allerdings auf dem Desktop irgendwohin klickst und das Frame verliert den Fokus dann funktioniert es natürlich nicht mehr.

Eine zweite Möglichkeit: Du nimmst ein Undecorated Frame oder ein Window. Statt dem verschieben könntest du die Maße des Fenster auf (0,0) verkleinern, und wieder per Shortcut auf die vorherige Größe, da hier das Fenster den Fokus behällt, würdest der Keylistener weiterhin funktionieren.

Dritte Möglichkeit. Du würdest in deinem Programm ein System TrayIcon implementieren. Sobald du das Fenster unsichtbar machst müsstest du den Fokus an das TrayIcon geben. Dieser würde dann auch auf Listener reagieren, und die Veränderungen im Fenster vornehmen. Hier könntest du entweder auf Klick auf das TrayIcon das Fenster wieder sichtbar machen, oder auch per Shortcut.


Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.Frame;
import java.io.PrintStream;

public class HelloWorld extends Frame implements KeyListener {

	private PrintStream o = System.out;

	private TextArea tArea = new TextArea();

	public HelloWorld() {
		super("HelloWorld");
		this.setLocation(50, 50);
		this.setResizable(true);
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		tArea.addKeyListener(this);
		tArea.setPreferredSize(new Dimension(300, 300));

		this.add(tArea, BorderLayout.CENTER);

		this.pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new HelloWorld();
	}

	public void keyTyped(KeyEvent e) {
	}

	public void keyPressed(KeyEvent e) {
		if (KeyEvent.CTRL_MASK == e.getModifiers()
				&& e.getKeyCode() == KeyEvent.VK_S){
			showFrame();
		}
		else if (KeyEvent.CTRL_MASK == e.getModifiers()
				&& e.getKeyCode() == KeyEvent.VK_H){
			hideFrame();
		}
	}

	public void keyReleased(KeyEvent e) {
	}

	public void showFrame() {
		if (this.getLocation() != new Point(50, 50))
			this.setLocation(50, 50);
	}

	public void hideFrame() {
		if (this.getLocation() != new Point(2000, 2000))
			this.setLocation(2000, 2000);
	}
}


Vg Erdal
 
Zurück