Java Swing:在按键时执行某些操作
我使用一个Java Swing:在按键时执行某些操作,java,swing,keyboard,key-bindings,onkeypress,Java,Swing,Keyboard,Key Bindings,Onkeypress,我使用一个KeyAdpater来获取事件和方法addkeylister,效果很好。问题是,当a按下键时,动作只会发生一次,而不是在按下时,按住键3-4秒后,动作会一直发生,这正是我想要的 我想知道是否有一种好方法可以让按键从一开始就被按下,而不是在按住3-4秒后,一直都执行该操作 我考虑了下一个解决方案,但可能已经有了一种实现方法: public abstract class MyKeyAdapter extends KeyAdapter{ private boolean isPress
KeyAdpater
来获取事件和方法addkeylister
,效果很好。问题是,当a按下键时,动作只会发生一次,而不是在按下时,按住键3-4秒后,动作会一直发生,这正是我想要的
我想知道是否有一种好方法可以让按键从一开始就被按下,而不是在按住3-4秒后,一直都执行该操作
我考虑了下一个解决方案,但可能已经有了一种实现方法:
public abstract class MyKeyAdapter extends KeyAdapter{
private boolean isPressed = false;
private int pressedKey = 0;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while(isPressed)
keyPressedAction(pressedKey);
}
});
@Override
public void keyPressed(KeyEvent e) {
if(!isPressed){
pressedKey = e.getKeyCode();
t.start();
}
}
@Override
public void keyReleased(KeyEvent e) {
if(isPressed && e.getKeyCode()==pressedKey)}
isPressed = false;
}
public abstract void keyPressedAction(int key);
}
通过使用,而不是使用KeyListener,在按下键时启动,然后在Swing释放时停止计时器,我在这方面取得了很好的成功。通过使用
KeyStroke.getKeyStroke(int-keyCode,int-modifiers,boolean-onkeyrease)
方法将正确的击键对象传递到绑定组件中,可以区分按键按下和释放。如果布尔参数为false,输入将响应按键,如果参数为true,输入将响应按键
举一个快速而不雅的例子:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class KeyBindingEg extends JPanel {
private static final String UP_KEY_PRESSED = "up key pressed";
private static final String UP_KEY_RELEASED = "up key released";
private static final int UP_TIMER_DELAY = 200;
private static final Color FLASH_COLOR = Color.red;
private Timer upTimer;
private JLabel label = new JLabel();
public KeyBindingEg() {
label.setFont(label.getFont().deriveFont(Font.BOLD, 32));
label.setOpaque(true);
add(label);
setPreferredSize(new Dimension(400, 300));
int condition = WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = getInputMap(condition);
ActionMap actionMap = getActionMap();
KeyStroke upKeyPressed = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false);
KeyStroke upKeyReleased = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true);
inputMap.put(upKeyPressed, UP_KEY_PRESSED);
inputMap.put(upKeyReleased, UP_KEY_RELEASED);
actionMap.put(UP_KEY_PRESSED, new UpAction(false));
actionMap.put(UP_KEY_RELEASED, new UpAction(true));
}
private class UpAction extends AbstractAction {
private boolean onKeyRelease;
public UpAction(boolean onKeyRelease) {
this.onKeyRelease = onKeyRelease;
}
@Override
public void actionPerformed(ActionEvent evt) {
if (!onKeyRelease) {
if (upTimer != null && upTimer.isRunning()) {
return;
}
System.out.println("key pressed");
label.setText(UP_KEY_PRESSED);
upTimer = new Timer(UP_TIMER_DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Color c = label.getBackground();
if (FLASH_COLOR.equals(c)) {
label.setBackground(null);
label.setForeground(Color.black);
} else {
label.setBackground(FLASH_COLOR);
label.setForeground(Color.white);
}
}
});
upTimer.start();
} else {
System.out.println("Key released");
if (upTimer != null && upTimer.isRunning()) {
upTimer.stop();
upTimer = null;
}
label.setText("");
}
}
}
private static void createAndShowGui() {
KeyBindingEg mainPanel = new KeyBindingEg();
JFrame frame = new JFrame("KeyBindingEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
@Pete我从下到上试过这个代码,反之亦然,我在比较中找不到单词…,直到你的小巷,啊哈