webForumDet fria alternativet
Logga in / Bli medlem

Hur lyssnar man på "hela" programmet efter KeyEvent?

Java

2 svar · 181 visningar · startad av mangan

Medlem sedan feb. 2003216 inlägg
Frågan#1

Hej!

Sitter här med ett nästan helt klart program men nu återstår det ett problem som jag inte kan lösa:

Jag vill lyssna efter KeyEvent på hela min applikation om man säger så. Har testat att lägga till en KeyListener på huvud JFramen men den verkar inte nås av någon anledning, m a o så skrivs inget ut på skärmen när jag bankar på min keyboard.
Min huvudklass där jag skapar min JFrame:

public class Main extends JFrame{
    public Main(){
	MyKeyListener l = new MyKeyListener();
	this.addKeyListener(l);

        //lite kod
        ......	
	FileWindow window = new FileWindow(dir1,dir2,rot);
	Controller controller = new Controller(window);
	this.getContentPane().setLayout(new BorderLayout());
	this.getContentPane().add(controller,BorderLayout.NORTH);
	this.getContentPane().add(window,BorderLayout.CENTER);
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.pack();
	this.show();
    }

    private class MyKeyListener implements KeyListener {
	public void keyPressed(KeyEvent e){
 	    System.out.println("knapp tryckt");	
	}
	public void keyReleased(KeyEvent e){
 	    System.out.println("knapp tryckt");	
	}
	public void keyTyped(KeyEvent e){
 	    System.out.println("knapp tryckt");	
	}
    }

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

Någon som ser vad det kan vara?

Medlem sedan juni 2003372 inlägg
#2

Du kan göra så att du skapar en EventQueue och lägger in den så att alla events passerar förbi (överlagra dispatchEvent) så du kan fånga upp alla dom events du vill. Inte helt ultimat, men det fungerar.

import java.awt.AWTEvent;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;

public class GlobalListeningFrame extends JFrame
{
	public GlobalListeningFrame()
	{

		Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueue()
		{
			protected void dispatchEvent(AWTEvent event)
			{
				if (event.getID() == KeyEvent.KEY_PRESSED)
					System.out.println("PRESSED");
				if (event.getID() == KeyEvent.KEY_RELEASED)
					System.out.println("RELEASES");
				if (event.getID() == KeyEvent.KEY_TYPED)
					System.out.println("TYPED");

				super.dispatchEvent(event);
			}

		});

		this.getContentPane().add(new JButton("hej hopp"));

		setSize(400, 400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	public static void main(String[] args)
	{
		new GlobalListeningFrame();
	}
}
Medlem sedan feb. 2003216 inlägg
#3

Funkade mycket bra fast jag är inte riktigt hundra på att jag förståd vad som hände... :)

262 ms totalt · 4 externa anrop · v20260731065814-full.5386d3bf
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)