おそらくキーを押している間移動したいものを作りたいのでしょうが、いまの構造では無理があります。
とりあえずヒント的な回答を書いておきます。
- いまのsetOnKeyPressedだけでは「押しっぱなし」を検知できません。setOnKeyReleasedも使う必要があります。
- boolean型の変数up,down,left,right,shiftを用意し、setOnKeyPressedで各キーに対応したフラグをtrueにし、setOnKeyReleasedでfalseにします
- 別スレッドで移動計算を行います。
- Platform.runLaterを使い、コントロールの座標を計算結果に合わせて移動させます
#キー管理クラスのサンプル
なにもテストしてませんので動作は保証しかねますが、やろうとすることはこういうことだと思います。
Java
1public class KeyManager {
2 private Map<KeyCode, boolean> map = new HashMap<>();
3 public void handleEvent(KeyEvent e) {
4 switch(e.getEventType()) {
5 case KeyEvent.KEY_PRESSED:
6 map.put(e.getCode(), false);
7 break;
8 case KeyEvent.KEY_RELEASED:
9 map.put(e.getCode(), true);
10 break;
11 }
12 }
13 public boolean isPressed(KeyCode code) {
14 return map.containsKey(code)?map.get(code):false;
15 }
16}
これをsetOnKeyPressed、setOnKeyReleasedそれぞれでKeyManager#handleEventを呼んでやり、Timeline内でisPressed(KeyCode.UP) & isPressed(KeyCode.LEFT)としてやれば「左上」を押していると認識できます。ただし、よくある問題としてフォーカスが外れたときに押しっぱなしになったりするので、そのへんの対処は自分で考えてみてください。
Java
1public static KeyManager keyManager = new KeyManager;
2
3// 中略
4root.setOnKeyPressed(event -> keyManager.handleEvent(event));
5root.setOnKeyReleased(event -> keyManager.handleEvent(event));
6
7// Timelineの処理の中
8if(keyManager.isPressed(KeyCode.UP)) {
9 //上を押されている
10}
11if(keyManager.isPressed(KeyCode.LEFT)) {
12 //左を押されている
13}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/16 08:52
2016/06/16 09:08
2016/06/16 15:12
2016/06/16 23:29
2016/06/17 01:48
2016/06/17 02:06
2016/06/25 04:13
2016/06/25 06:23
2016/06/25 07:49
2016/06/25 08:38