Wenn eine gedrückte Taste ein Auslöser ist, um die GUI zu aktualisieren, dann müssen Sie SwingTimers einbinden. Wenn es keine Aktualisierung der GUI auslöst, können Sie einfach normale Threads verwenden.
Ich nehme an, die Artikel beziehen sich auf folgende Punkte
- Speichern, welche Tasten gedrückt werden, mit der
KeyListener
- Mit einem Swing Timer prüfen, welche Tasten in bestimmten Intervallen (z. B. alle 100 ms) gedrückt werden.
Hier ist ein Beispiel dafür, wie Sie das in Ihr Projekt einbauen könnten KeyListener
:
public class Keyer implements KeyListener{
/** Stores currently pressed keys */
HashSet<Integer> pressedKeys = new HashSet<Integer>();
public Keyer(){
//Check every 100ms if there's keys pressed
//(This is the Swing Timer they talk about)
new Timer(100, new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
String keysString = "";
if(!pressedKeys.isEmpty()){
Iterator<Integer> i = pressedKeys.iterator();
while(i.hasNext()){
keysString += i.next() + ",";
}
}
System.out.println(keysString);
}
}).start();
}
@Override
public void keyPressed(KeyEvent ovent){
//Add key to hashSet when pressed
int keyCode = ovent.getKeyCode();
pressedKeys.add(keyCode);
}
@Override
public void keyReleased(KeyEvent ovent){
//Remove key from hashset when released
int keyCode = ovent.getKeyCode();
pressedKeys.remove(keyCode);
}
@Override
public void keyTyped(KeyEvent ovent){}
}
Hier ist ein Beispiel, bei dem alles zusammengefügt ist - ein Etikett wird aktualisiert, das genau angibt, welche Tasten gedrückt werden (nach Tastencode).
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
public class TempProject extends JPanel{
/** Label to update with currently pressed keys */
JLabel output = new JLabel();
public TempProject(){
super();
setFocusable(true);
add(output, BorderLayout.CENTER);
requestFocus();
addKeyListener(new Keyer());
}
public static void main(String args[])
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setContentPane(new TempProject());
frame.pack();
frame.setVisible(true);
new TempProject();
}
});
}
public class Keyer implements KeyListener{
/** Stores currently pressed keys */
HashSet<Integer> pressedKeys = new HashSet<Integer>();
public Keyer(){
//Check every 100ms if there's keys pressed
//(This is the Swing Timer they talk about)
new Timer(100, new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
String keysString = "";
if(!pressedKeys.isEmpty()){
Iterator<Integer> i = pressedKeys.iterator();
while(i.hasNext()){
keysString += i.next() + ",";
}
}
output.setText(keysString);
}
}).start();
}
@Override
public void keyPressed(KeyEvent ovent){
//Add key to hashSet when pressed
int keyCode = ovent.getKeyCode();
pressedKeys.add(keyCode);
}
@Override
public void keyReleased(KeyEvent ovent){
//Remove key from hashset when released
int keyCode = ovent.getKeyCode();
pressedKeys.remove(keyCode);
}
@Override
public void keyTyped(KeyEvent ovent){}
}
}
Editar
Bitte beachten Sie auch die von @HovercraftFullOfEels geposteten Warnungen über KeyListener
. Je nachdem, was Sie erreichen wollen, sollten Sie die Verwendung von Schlüsselbindungen in Betracht ziehen (es gilt das gleiche Prinzip wie in diesem Beitrag). Hier ist eine nützliche Lehrgang auf Key Bindings, wenn Sie einen Blick darauf werfen möchten.