webForumDet fria alternativet

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

2 svar · 179 visningar · startad av mangan

manganMedlem sedan feb. 2003219 inlägg
#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?

Aleph_OneMedlem sedan juni 2003370 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();
	}
}
manganMedlem sedan feb. 2003219 inlägg
#3

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

Genererad på 378 ms · cache AV · v20260730165559-full.f96bc7eb