質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

4183閲覧

java キー入力

Puhu

総合スコア31

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/12/30 04:55

現在javaでキーを感知するプログラムを作成しているのですが、キーを押しても反応しません。
KeyListenerは単独で設置することはできないのでしょうか。
その場合、プログラムを実行して、キー入力を常時受け付けるにはどのようにしたらよいでしょうか。

import java.io.File;
import java.io.IOException;
import javax.swing.;
import java.awt.
;
import java.awt.event.;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.ImageIcon;
import java.applet.
;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

public class mendo3 extends JFrame implements ActionListener,KeyListener{

static mendo3 frame = new mendo3("* 。violin mania。 *"); static JFrame frames = new JFrame("* 。 music select。 *");//曲選択

public static void main(String args[]){
frame.setVisible(true);
}

mendo3(String title){ setTitle(title); setBounds(600,10,600,1000); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setLayout(null); ImageIcon top_bg = new ImageIcon("top.png"); JLabel bg1 = new JLabel(top_bg); bg1.setBounds(0,0,600,1000); ImageIcon icon2 = new ImageIcon("option.png"); JButton fileButton = new JButton(icon2); fileButton.setBounds(370,750,200,50); fileButton.addActionListener(this); ImageIcon icon1 = new ImageIcon("start.png"); JButton button = new JButton(icon1); button.setBounds(370,600,200,50); button.addActionListener(this); button.setActionCommand("start"); p.add(bg1); p.add(button); p.add(fileButton); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); } public void init(){ addKeyListener(this); } public void actionPerformed(ActionEvent e){ String cmd = e.getActionCommand(); if (cmd.equals("start")){ AudioClip audio; audio = Applet.newAudioClip(getClass().getResource("pinpon.wav")); audio.play(); } } public void keyPressed(KeyEvent e){ } public void keyReleased(KeyEvent e){ } public void keyTyped(KeyEvent e){ char key = e.getKeyChar(); if(key == 'a'){ AudioClip audio; audio = Applet.newAudioClip(getClass().getResource("pinpon.wav")); audio.play(); } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

KeyListenerは、フォーカスされているコンポーネントに対して有効になるので、そのフォーカスされているコンポーネントにKeyListenerが設定されていなければなりません。
私が実際に動かしてみたところでは、起動直後はbuttonにフォーカスされていました。

キーを押したときにどのコンポーネントにフォーカスが当たっているかは不定ですので、今のままではこういう風にすれば動くようになります。

lang

1addKeyListener(this); 2bg1.addKeyListener(this); 3fileButton.addKeyListener(this); 4button.addKeyListener(this);

ですが、コンポーネントを追加するたびにaddKeyListenerを追加しないといけないのはちょっといただけませんね。

こういう場合は、InputMapActionMapを組み合わせます。
JFrameには直接設定できないので、getRootPane()で取得したコンポーネントに設定します。
JComponent.WHEN_IN_FOCUSED_WINDOWを設定することで、RootPaneの子のコンポーネントにフォーカスが当たっていても、キーイベントを拾うことができます。

  • InputMapActionMapを使った例

lang

1// addKeyListener(this); // KeyListenerは使わない 2 3InputMap imap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 4ActionMap amap = getRootPane().getActionMap(); 5 6// キーバインド: Aキー(修飾キーなし) 7KeyStroke ksA = KeyStroke.getKeyStroke(KeyEvent.VK_A, 0); 8// アクションキー 9String akPlaySound = "play-sound"; 10// アクション 11Action action = new AbstractAction() { 12 @Override 13 public void actionPerformed(ActionEvent evt) { 14 AudioClip audio = Applet.newAudioClip(getClass().getResource("pinpon.wav")); 15 audio.play(); 16 } 17}; 18imap.put(ksA, akPlaySound); 19amap.put(akPlaySound, action);

投稿2015/12/30 05:19

編集2015/12/30 07:44
argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Puhu

2015/12/30 06:13

アプレットの時しか使えないのですね...ありがとうございます! mendo3に移動してみましたが、結果は変わりませんでした
argius

2015/12/30 07:45

すみません、最初のは無しで。 回答を書き換えましたので、ご確認ください。
Puhu

2016/01/03 07:21 編集

今まで体調を崩し、確認できませんでした。遅れて申し訳ございません。 わざわざ2種類の方法をご提示してくださり非常に参考になりました。 (途中送信してしまいました) 今回はInputMapとActionMapを用いて導入しようと思います。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問