PDA

View Full Version : [java] listener tasto canc


pumppkin
01-12-2006, 15:34
Ciao, c'è un modo per far si che alla pressione del tasto canc della tastiera questo mi esegue alcune istruzioni?

PGI-Bis
01-12-2006, 16:07
Per farlo devi avere a disposizione una finestra AWT visibile, il che, se intendo bene la tua richiesta, penso non vada bene.

L'alternativa è catturare l'evento passando per una finestra nativa ma qui ci sono dei dettagli che variano da sistema a sistema.

pumppkin
03-12-2006, 19:19
cosa intendi per una finestra awt visibile?...

PGI-Bis
03-12-2006, 19:21
un Window, JWindow, Applet, JApplet, Frame, JFrame, Dialog, JDialog aperta e selezionata sullo schermo.

pumppkin
04-12-2006, 10:06
Io quando devo premere il tasto canc sto lavorando su un frame quindi, come dici tu, si dovrebbe poter fare...

PGI-Bis
04-12-2006, 14:12
Ok.

Crea un'azione che gestisca la reazione alla pressione del tasto canc.

Action deletePressedAction = new AbstractAction("del") {
public void actionPerformed(ActionEvent e) {
invocaMetodoCheContieneIlCodiceDellaReazione();
}
};

Crea un KeyStroke corrispondente alla pressione del tasto "canc":

KeyStroke deleteKeyStroke = KeyStroke.getKeyStroke(
KeyEvent.VK_DELETE, 0);

Piglia il pannello del contenuto di quel frame.

JComponent contentPane = (JComponent)jframe.getContentPane();

Prendi la sua mappa delle azioni.

ActionMap contentPaneActionMap = contentPane.getActionMap();

e infila lì dentro la tua azione:

contentPaneActionMap.put("action delete", deletePressedAction);

Poi prendi la mappa degli input del contentPane.

InputMap contentPaneInputMap = contentPane.getInputMap(
JComponent.WHEN_IN_FOCUSED_WINDOW);

e infila il quella mappa il key stroke, associato alla chiave dell'azione di prima.

contentPaneInputMap.put(deleteKeyStroke, "action delete");

Fine. Se hai dei componenti che possono interferire con la pressione del tasto canc (tipicamente i componenti di testo) e vuoi comunque mantenere la capacità di reagire alla pressione di questo tasto, puoi fare un "ponte" alla propagazione degli eventi AWT. Crei un'estensione di EventQueue e nel suo metodo dispatchEvent, prima di invocare super.dispatchEvent, gestisci l'AWTEvent nel caso in cui sia una pressione del tasto DELETE (Canc sulla tastiera). E' forse il modo più drastico.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Main implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Main());
}

private class BypassQueue extends EventQueue {
protected void dispatchEvent(AWTEvent e) {
if(e.getID() == KeyEvent.KEY_PRESSED) {
KeyEvent k = (KeyEvent)e;
if(k.getKeyCode() == KeyEvent.VK_DELETE) {
handleKeyDelPressed();
}
}
super.dispatchEvent(e);
}
};


private JFrame frame;

public Main() {
JFrame window = new JFrame("Window");
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.add(new JTextArea());
frame = window;
}

public void run() {
frame.setSize(300, 300);
frame.setVisible(true);
Toolkit.getDefaultToolkit().getSystemEventQueue().push(new BypassQueue());
}

private void handleKeyDelPressed() {
System.out.println("YOU ARE THE ONE!");
}
}

Non sono le uniche soluzioni ma rappresentano il medio e il massimo che puoi fare.

pumppkin
05-12-2006, 14:42
ti ringrazio...sei stato davvero esauriente...