押されたキーがGUIを更新するトリガーである場合は、SwingTimersを組み込む必要があります。GUIの更新がトリガーされない場合は、通常のスレッドを使用できます。
記事が参照していると私が思うのは
- を使用して押されたキーを保存する
KeyListener
- スイングタイマーを使用して、指定された間隔(たとえば100msごと)に押されたキーを確認します
これをどのようにあなたのに組み込むことができるかのサンプルがあります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){}
}
これがすべてがまとめられたサンプルです-ラベルが更新され、どのキーが押されたかを正確に示します(キーコードによって)。
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){}
}
}
編集
また、@HovercraftFullOfEelsによって投稿された警告を参照してくださいKeyListener
。達成しようとしていることによっては、キーバインディングの使用を検討することをお勧めします(この投稿と同じ原則が適用されます)。ご覧になりたい場合は、キーバインディングに関する便利なチュートリアルをご覧ください。