|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Feb 2005
Messaggi: 295
|
[java] listener tasto canc
Ciao, c'è un modo per far si che alla pressione del tasto canc della tastiera questo mi esegue alcune istruzioni?
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Feb 2005
Messaggi: 295
|
cosa intendi per una finestra awt visibile?...
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
un Window, JWindow, Applet, JApplet, Frame, JFrame, Dialog, JDialog aperta e selezionata sullo schermo.
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Feb 2005
Messaggi: 295
|
Io quando devo premere il tasto canc sto lavorando su un frame quindi, come dici tu, si dovrebbe poter fare...
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Ok.
Crea un'azione che gestisca la reazione alla pressione del tasto canc. Codice:
Action deletePressedAction = new AbstractAction("del") {
public void actionPerformed(ActionEvent e) {
invocaMetodoCheContieneIlCodiceDellaReazione();
}
};
Codice:
KeyStroke deleteKeyStroke = KeyStroke.getKeyStroke(
KeyEvent.VK_DELETE, 0);
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. Codice:
InputMap contentPaneInputMap = contentPane.getInputMap(
JComponent.WHEN_IN_FOCUSED_WINDOW);
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. Codice:
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!");
}
}
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Feb 2005
Messaggi: 295
|
ti ringrazio...sei stato davvero esauriente...
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:39.


















