2016-06-26 7 views
-2

クリックすると特定のサウンドを再生するアイコンタイルでスイングプログラムを作成したいと思います。このために私はクラスを作成しました:MouseListenerがカスタムJLabelに対してトリガーしない

public class Item extends JLabel implements MouseListener { 
    public Item(String s) { 
      // constructor setting background icon and private field with the sound to play 
    } 

    public void playSound(); //plays the sound 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     System.out.println("Clicked"); 
     this.playSound(); 

    } 


    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 


    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 


    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 
     System.out.println("Pressed"); 

    } 


    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 
} 

は、それから私は、カスタムJFrameクラスを作成します。

public class Frame extends JFrame { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 9221468315661092752L; 
    public static final int DEFAULT_FRAME_WIDTH=400; 
    public static final int DEFAULT_FRAME_HEIGHT=400; 
    private GridLayout gridLayout; 

    private ArrayList<Item> tiles=new ArrayList<Item>(); 


    public Frame() { 
     super("Title"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(new Dimension(DEFAULT_FRAME_WIDTH,DEFAULT_FRAME_HEIGHT)); 
     gridLayout=new GridLayout(4,4,10,10); 
     setLayout(gridLayout); 
     addItems(); 

    } 

    public void addItems() { 
     Item item=new Item("name"); 
     Item item2=new Item("name"); 
     tiles.add(item); 
     tiles.add(item2); 
     this.add(item); 
     this.add(item2); 
    } 

    public static void main(String[] args) { 

     Frame frame=new Frame(); 
     frame.setVisible(true); 
    } 

タイルがグリッドレイアウトで正常に表示され、しかし問題は、マウスリスナーが動作しないということです。 mouseClicked()とに入れたprintln()は呼び出されません。

私はItemMouseListenerを持つように、MouseListenerItemクラスに追加しようとする可能性がありますが、私は上記のコードが間違っているのだろうか。

+2

'私はその項目がのMouseListenerを持っているので、ItemクラスにするMouseListenerを追加しようとすることができますが、私は間違っているのだろうか上記のコードで - それはまさにあなたがクラスを作成するときにインスタンスにMouseListenerを追加しなかった問題です。あなたが指示しない限り、コンポーネントはイベントを聴いていません。 MouseListenerインターフェイスを実装しても、MouseEventsをリッスンするようには通知されません。実際の例については、[MouseListenerの記述方法](http://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html)のSwingチュートリアルのセクションを参照してください。 – camickr

+0

アイコン付きサンセリフ・ボタン/アクション・リスナーは、ラベル/マウスのコンボをすべて行います。キーボード入力にも対応しています。 –

答えて

0

あなたには2つの問題があります。 1つは、あなたのJLabelsは表示されません(私はそれが意図的に除外されているかどうかはわかりませんが)。 2つ目は、マウスリスナーを追加しないことです。あなたは余分なクラスをせずに、コンストラクタに二つの文を追加することによって、これを達成することができます

public Item(String s) { 
    super(s); //initializes the text and display using JLabel's constructor 
    addMouseListener(this); //uses the reference of this Item as a MouseListener 
} 
+2

または、チュートリアルを読んで少し問題が発生するたびに質問する必要はありません。それがチュートリアルへのリンクがコメントに与えられた理由です。チュートリアルへのリンクは、将来の使用のためにブックマークする必要があります。このチュートリアルでは、コードをよりよく構造化してJFrameを拡張しないようにする方法と、EDTでコンポーネントを作成する方法についても説明します。まず最初に良い例を示してから変更してください。 – camickr

+0

あなたは確かに可能です。 – RobotKarel314

関連する問題