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

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

ただいまの
回答率

87.78%

javaにおけるkeylistener classの適応について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 965

score 20

問題点

前回までの質問同様のプログラムの問題です。
下記のプログラムですが、ご回答いただいた方の指摘を入れてみたところあと一歩のところでコンパイルできません

View5をKeyListenerに変換できません
p.addKeyListener(this);


これはJPanelクラスであるpにはKeyListenerが適応できないということでしょうか?
それともaddKeyListenerがついた変数が被っているからエラーが出てしまっているのでしょうか?
ご回答どうぞよろしくおねがいいたします。

ソースコード

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;

import javax.swing.Timer;

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 {
    protected Shape shape;
    protected Shape base;
    public RoundButton(Icon icon){
    super(icon);
    setModel(new DefaultButtonModel());
    setBackground(Color.BLACK);
    setContentAreaFilled(false);
    setFocusPainted(false);
    setBorderPainted(false);
    setAlignmentY(Component.TOP_ALIGNMENT);
    initShape();
    }
    protected void initShape(){
    if(!getBounds().equals(base)){
        Dimension s = getPreferredSize();
        base = getBounds();
        shape = new Ellipse2D.Float(0,0,s.width,s.height);
    }
    }
    @Override public Dimension getPreferredSize(){
    Icon icon = getIcon();
    Insets i = getInsets();
    int iw = Math.max(icon.getIconWidth(), icon.getIconHeight());
    return new Dimension(iw+i.right+i.left,iw+i.top+i.bottom);
    }
    @Override public boolean contains(int x,int y){
    initShape();
    return super.contains(x,y);
    }
}

//------------------------------------------------------
class Controller extends WindowAdapter  implements KeyListener {
    private Model model;
    private View5 view;
    Timer timer;
    RoundButton flushButton;
    Color defaultColor = Color.BLACK;
    Color flushColor = Color.RED;
    boolean flushFlag;
    public Controller(Model model){
        this.model=model;
        timer = new Timer(1000,this::expired);
    timer.setRepeats(true);
    }

    public void setView(View5 view) {
    this.view = view;
    }

    public void keyTyped(KeyEvent actionEvent){
        char c= actionEvent.getKeyChar();
    RoundButton button = null;
        switch(c){
        case'a':  model.snea1();button = view.snea1; break;
        case'q':  model.symbal2();button = view.symbal2; break;
        case'f':  model.tam1();button = view.tam1; break;
        case'g':  model.tam2();button = view.tam2; break;
        case'h':  model.tam3();button = view.tam3; break;
        case'b':  model.bass();button = view.bass; break;
        case'p':  model.crush();button = view.crush; break;
        case'l':  model.hihat();button = view.hihat; break;
    }

    if (button != null) {
        flushButton(button);
    }



    }

    public void keyPressed(KeyEvent actionEvent){ }
    public void keyReleased(KeyEvent actionEvent){ }

    void expired(ActionEvent dummy) {
    flushFlag = !flushFlag;

    flushButton.setBackground(flushFlag ? flushColor : defaultColor);
    flushButton.repaint();
    }


    public void flushButton(RoundButton button) {
    timer.stop();
    if (flushButton != null) {
        flushButton.setBackground(defaultColor);
        flushButton.repaint();
    }
    flushButton = button;
    timer.start();
    flushFlag = false;
    expired(null);
    }

}
//----------------------------------------------------------------------
class Model extends Observable{
    private AudioClip pong;

    public void snea1(){
        pong = Applet.newAudioClip(getClass().getResource("se_maoudamashii_instruments_drum1_snare.wav"));
        pong.play();
    }
    public void symbal2(){
        pong = Applet.newAudioClip(getClass().getResource("se_maoudamashii_instruments_drum2_cymbal.wav"));
        pong.play();
    }
    public void tam1(){
        pong = Applet.newAudioClip(getClass().getResource("se_maoudamashii_instruments_drum1_tom1.wav"));
        pong.play();
    }
    public void tam2(){
        pong = Applet.newAudioClip(getClass().getResource("se_maoudamashii_instruments_drum1_tom2.wav"));
        pong.play();
    }
    public void tam3(){
        pong = Applet.newAudioClip(getClass().getResource("se_maoudamashii_instruments_drum1_tom3.wav"));
        pong.play();
    }
    public void bass(){
        pong = Applet.newAudioClip(getClass().getResource("se_maoudamashii_instruments_drum2_bassdrum.wav"));
        pong.play();
    }
    public void crush(){
        pong = Applet.newAudioClip(getClass().getResource("se_maoudamashii_instruments_drum2_cymbal.wav"));
        pong.play();
    }
    public void hihat(){
        pong = Applet.newAudioClip(getClass().getResource("se_maoudamashii_instruments_drum1_hat.wav"));
        pong.play();
    }

}
//---------------------------------------------------------
class View5 extends JFrame{

    RoundButton snea1;
    RoundButton symbal2;
    RoundButton tam1;
    RoundButton tam2;
    RoundButton tam3;
    RoundButton bass;
    RoundButton crush;
    RoundButton hihat;

    public View5(Controller aController){

        this.setSize(750,440);
        JPanel p =new JPanel();
        p.setLayout(null);
        ImageIcon icon1 = new ImageIcon("./s_Snea.png");
    snea1=new RoundButton(icon1);
        snea1.setBounds(50, 250, 150, 150);

        ImageIcon icon2 = new ImageIcon("./s_Cymbal.png");
        symbal2=new RoundButton(icon2);
        symbal2.setBounds(0, 0, 180, 180);

        ImageIcon icon3 = new ImageIcon("./s_Tam.png");
        tam1=new RoundButton(icon3);
        tam1.setBounds(180, 100, 130,130);

        ImageIcon icon4 = new ImageIcon("./s_Tam2.png");
        tam2=new RoundButton(icon4);
        tam2.setBounds(310, 50, 130,130);

        ImageIcon icon5 = new ImageIcon("./s_Tam3.png");
        tam3=new RoundButton(icon5);
        tam3.setBounds(440, 100, 130, 130);

        ImageIcon icon6 = new ImageIcon("./s_Bass.png");
        bass=new RoundButton(icon6);
        bass.setBounds(285, 230, 180, 180);

        ImageIcon icon7 = new ImageIcon("./s_Crush.png");
        crush=new RoundButton(icon7);
        crush.setBounds(570, 0, 180, 180);

        ImageIcon icon8 = new ImageIcon("./s_Ride.png");
        hihat=new RoundButton(icon8);
        hihat.setBounds(500, 230, 180, 180);

        p.setOpaque(false);
    snea1.addKeyListener(aController);
    symbal2.addKeyListener(aController);
    tam1.addKeyListener(aController);
    tam2.addKeyListener(aController);
    tam3.addKeyListener(aController);
    bass.addKeyListener(aController);
    crush.addKeyListener(aController);
    hihat.addKeyListener(aController);

    snea1.setActionCommand("snea1");
    symbal2.setActionCommand("symbal2");
    tam1.setActionCommand("tam1");
    tam2.setActionCommand("tam2");
    tam3.setActionCommand("tam3");
    bass.setActionCommand("bass");
    crush.setActionCommand("crush");
    hihat.setActionCommand("hihat");

        p.add(snea1);
        p.add(symbal2);
        p.add(tam1);
        p.add(tam2);
        p.add(tam3);
        p.add(bass);
        p.add(crush);
        p.add(hihat);

    p.setFocusable(true);
    p.addKeyListener(aController);

        this.addWindowListener(aController);
        getContentPane().add(p, BorderLayout.CENTER);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String[] args){
    new View5(new Controller(new Model()));
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

前回の回答に間違いがありました。申し訳ありません。
KeyListenerを実装していないクラスのインスタンス(View5のthis)をaddKeyListenerの引数(KeyListenerのインスタンスでなければならない)に指定したのがエラーの原因です。

public View5(Controller aController){
  ...
  // ContentPaneであるJPanelでキーイベントを受けられるようにしておく(必ずしも必要ない)
  p.addKeyListener(this); // 誤り
  p.addKeyListener(aController); // こちらが正しい
}


本質問のコード上は既に正しく修正されているように見えます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る