Wenn das Drücken einer Taste ein Auslöser für die Aktualisierung deines GUI ist, dann musst du SwingTimers verwenden. Wenn es keine Aktualisierung deines GUI auslöst, kannst du einfach normale Threads verwenden.
Was ich vermute, auf das sich die Artikel beziehen, ist
- Speichern der gedrückten Tasten mit dem
KeyListener
- Verwendung eines Swing-Timers, um zu überprüfen, welche Tasten in bestimmten Intervallen gedrückt sind (zum Beispiel alle 100 ms)
Hier ist ein Beispiel, wie du das in deinen KeyListener
einbauen könntest:
public class Keyer implements KeyListener{
/** Speichert momentan gedrückte Tasten */
HashSet pressedKeys = new HashSet();
public Keyer(){
//Überprüfe alle 100ms, ob Tasten gedrückt sind
//(Dies ist der Swing Timer, von dem sie sprechen)
new Timer(100, new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
String keysString = "";
if(!pressedKeys.isEmpty()){
Iterator i = pressedKeys.iterator();
while(i.hasNext()){
keysString += i.next() + ",";
}
}
System.out.println(keysString);
}
}).start();
}
@Override
public void keyPressed(KeyEvent ovent){
//Füge Taste zum Hashset hinzu, wenn gedrückt
int keyCode = ovent.getKeyCode();
pressedKeys.add(keyCode);
}
@Override
public void keyReleased(KeyEvent ovent){
//Entferne Taste aus Hashset, wenn losgelassen
int keyCode = ovent.getKeyCode();
pressedKeys.remove(keyCode);
}
@Override
public void keyTyped(KeyEvent ovent){}
}
Hier ist ein Beispiel, wo alles zusammengefügt wird - ein Label wird aktualisiert und zeigt genau an, welche Tasten gedrückt sind (nach Keycode).
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
public class TempProject extends JPanel{
/** Label zur Aktualisierung mit momentan gedrückten Tasten */
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{
/** Speichert momentan gedrückte Tasten */
HashSet pressedKeys = new HashSet();
public Keyer(){
//Überprüfe alle 100ms, ob Tasten gedrückt sind
//(Dies ist der Swing Timer, von dem sie sprechen)
new Timer(100, new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
String keysString = "";
if(!pressedKeys.isEmpty()){
Iterator i = pressedKeys.iterator();
while(i.hasNext()){
keysString += i.next() + ",";
}
}
output.setText(keysString);
}
}).start();
}
@Override
public void keyPressed(KeyEvent ovent){
//Füge Taste zum Hashset hinzu, wenn gedrückt
int keyCode = ovent.getKeyCode();
pressedKeys.add(keyCode);
}
@Override
public void keyReleased(KeyEvent ovent){
//Entferne Taste aus Hashset, wenn losgelassen
int keyCode = ovent.getKeyCode();
pressedKeys.remove(keyCode);
}
@Override
public void keyTyped(KeyEvent ovent){}
}
}
Bearbeiten
Siehe auch die Warnungen von @HovercraftFullOfEels bezüglich des KeyListener
. Je nachdem, was du erreichen möchtest, solltest du in Betracht ziehen, Key Bindings zu verwenden (dieselben Prinzipien wie in diesem Beitrag gelten). Hier ist ein nützliches Tutorial zu Key Bindings, wenn du es dir ansehen möchtest.