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

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

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

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

Q&A

解決済

1回答

3414閲覧

javaでのkey入力によるbutton点滅方法について。

datuota00

総合スコア20

Java

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

0グッド

0クリップ

投稿2016/12/15 09:45

###実現したいこと
javaでキーを入力した時に音がなるゲームを作ろうと思っています。
音を出すこと自体は成功しているのですが音を出したボタンを点滅させたい
とおもい(キーが押されたことを表現したく)やってみたのですが該当するようなコードが調べても出てきません。キーを押した時に該当するボタンを点滅させたいです。
どなたか可能な方はいらっしゃいますでしょうか。よろしくお願い致します。
###該当のソースコード
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;

import java.awt.;
import java.awt.geom.Ellipse2D;
import javax.swing.
;
import java.util.*;

import java.applet.*;

import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;

class RoundButton extends JButton {//画像の背景を透過させるクラス
//-----------------------------------------------------
class Controller extends WindowAdapter implements KeyListener{ //キー入力を判別するクラス
//----------------------------------------------------

class Model extends Observable{
private AudioClip pong;
public void snea1(){ //音を鳴らす
}
//-----------------------------------------------------

class View4 extends JFrame{

public View4(Controller aController){ this.setSize(750,440); JPanel p =new JPanel(); p.setLayout(null); ImageIcon icon1 = new ImageIcon("画像ファイル"); RoundButton snea1=new RoundButton(icon1); snea1.setBounds(50, 250, 150, 150);//位置と大きさ p.setOpaque(false); snea1.addKeyListener(aController); snea1.setActionCommand("snea1"); p.add(snea1); this.setFocusable(true); this.addWindowListener(aController); getContentPane().add(p, BorderLayout.CENTER); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args){ new View4(new Controller(new Model())); }

}

###補足情報(言語/FW/ツール等のバージョンなど)
このプログラムはmvcモデルで作成しています。

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

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

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

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

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

KSwordOfHaste

2016/12/15 10:21 編集

コードは<code>ボタンを使って適切に字下げしてください。
datuota00

2016/12/15 16:28

<code>はそういう風に使うのですね。自分の勉強不足でみにくくなってしまいました。すいません。ご指摘ありがとうございます。よろしければコメントの疑問、考えていただけると幸いです。失礼いたしました。
KSwordOfHaste

2016/12/16 00:57

質問がクローズ状態になってしまってますが、それでも後から閲覧するひとのために質問を編集しておくことが望ましいですよ。
datuota00

2016/12/16 02:35

見辛くなってしまうのでまた新しい質問としてあげさせていただきます。 こういうのははじめてでいろいろ教えていただきありがとうございます。
guest

回答1

0

ベストアンサー

javax.swing.Timerを使うのがよいと思います。一定時間ごとにActionEventを通知してくれるのでそのハンドラーでボタンの明滅処理などを行えばよさそうです。TimerによるイベントはEvent Dispatch Thread上でハンドラーが起動されるのでスレッド間の同期などはとりあえずは気にする必要はありません。

コントローラーのKeyTypedハンドラーでイベント発行元のボタンを明滅するコード例は以下のような感じです。点滅処理はいい加減なのでそこは読み替えてください。

java

1class Controller extends WindowAdapter implements KeyListener { 2 ... 3 Timer timer; 4 RoundButton flushButton; 5 Color defaultColor = Color.GRAY; //色は適当です 6 Color flushColor = Color.RED; //色は適当です 7 boolean flushFlag; 8 9 Controller(Model model) { 10 ... 11 timer = new Timer(1000, this::expired); // 1秒ごとにexpiredを起動 12 timer.setRepeats(true); 13 } 14 15 //ボタンの点滅を開始 16 void flushButton(RoundButton button) { 17 timer.stop(); 18 if (flushButton != null) { 19 // 以前点滅していた別のボタンの色をデフォルトに戻す 20 flushButton.setBackground(defaultColor); 21 } 22 flushButton = button; 23 timer.start(); 24 } 25 26 //ボタンの点滅(Timerにより起動) 27 void expired(ActionEvent ev) { 28 flushFlag = !flushFlag; 29 flushButton.setBackground(flushFlag ? defaultColor : flushColor); 30 flushButton.repaint(); 31 } 32 33 @Override 34 public void keyTyped(KeyEvent e) { 35 ... 36 if (e.getSource() instanceof JButton) { 37 flushButton((JButton)e.getSource()); 38 } 39 } 40 ... 41}

投稿2016/12/15 11:19

KSwordOfHaste

総合スコア18394

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

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

datuota00

2016/12/15 16:22

class Controller extends WindowAdapter implements KeyListener{ private Model model; Timer timer; RoundButton flushButton; Color defaultColor = Color.GRAY; Color flushColor = Color.RED; boolean flushFlag; public Controller(Model model){ this.model=model; timer = new Timer(1000, this::expired); timer.setRepeats(true); } public void keyTyped(KeyEvent actionEvent){ char c= actionEvent.getKeyChar(); switch(c){ case'a': model.snea1(); break; case'q': model.symbal2(); break; case'f': model.tam1(); break; case'g': model.tam2(); break; case'h': model.tam3(); break; case'b': model.bass(); break; case'p': model.crush(); break; case'l': model.hihat(); break; } if (actionEvent.getSource() instanceof RoundButton) { flushButton((RoundButton)actionEvent.getSource()); } } public void keyPressed(KeyEvent actionEvent){ } public void keyReleased(KeyEvent actionEvent){ } public void flushButton(RoundButton button) { timer.stop(); if (flushButton != null) { flushButton.setBackground(defaultColor); } flushButton = button; timer.start(); } void expired(ActionEvent ev) { flushFlag = !flushFlag; flushButton.setBackground(flushFlag ? defaultColor : flushColor); flushButton.repaint(); } } ご回答本当にありがとうございます。 教えていただいたコードを書き込んで繋がるように少しいじってみましたが、コンパイルしたところ、点滅はせず画像に変化がありませんでした、、 上記がcontrollerクラスです。自分なりに考えた結果 void expired(ActionEvent ev)がちゃんと機能していないのではないかと思いました。お時間ございましたらご意見お聞かせください。宜しくお願い致します。
KSwordOfHaste

2016/12/16 00:42

質問コメントにも書きましたがコードは整形(字下げ)して閲覧者に見やすくすることが重要です。全ての質問は同様の疑問を持つ全ての閲覧者で共有することが望ましいからです。コメントでは字下げができませんので長いコードは質問文を編集するすることによって記載するようにしてくださいね。
KSwordOfHaste

2016/12/16 00:45

失礼、本質問はベストアンサーがつけられてしまってるので「解決済み」になってしまってます。ベストアンサーを外して未解決にもどせるのかな?もし戻せないなら新たな質問を起こした方がよいですね。
KSwordOfHaste

2016/12/16 02:40

ちなみに自分は一応コードを動かしてみて点滅を確認しました。キーイベントが発生するためにはフォーカスがRoundButtonになければならないことや、RoundButtonのbackgroundを変えることが本当に点滅になってくれるのかはなんともいえません。expiredが起動しているかはデバッグプリントで確認できますが、backgroundを変えたときの効果がどうなるかはRoundButtonの実装をみないとなんともいえません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問