JPanelに
MouseMotionListenerをつけて、
マウスが動くたびに、
mouseMovedを呼び出して、マウスの座標を
getX()と、getY()
を使って、取得するようなプログラムを作ったのですが、

JPanel上にJLabelを何枚か配置しており、
マウスが、JLabelの上に来ると、mousuMovedが認識できません。

ちなみに、JLabelにもmouseMovedをつけると、
取得する座標が、JLabel上の座標になってしまいます。

JPanel上の座標をJLabelの上にマウスが来ても正確に取得するにはどうしたらいいでしょうか?

A 回答 (2件)

// 一応自分で計算しなくてもそういうの用意されているみたいね。


// http://download.oracle.com/javase/7/docs/api/jav …

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Hello extends JFrame implements MouseMotionListener{

public Hello(){
JLabel label1 = new JLabel("Hello, World!");
label1.setBackground(java.awt.Color.GREEN);
label1.setOpaque(true);

JLabel label2 = new JLabel("Hello, World!");
label2.setBackground(java.awt.Color.RED);
label2.setOpaque(true);
label2.addMouseMotionListener(this);

setLayout(new GridLayout(1, 2));
getContentPane().add(label1);
getContentPane().add(label2);

setSize(300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setLocationRelativeTo(null);
}

public void mouseDragged(MouseEvent e){
}
public void mouseMoved(MouseEvent e){
setTitle(Double.toString(SwingUtilities.convertPoint((Component)e.getSource(), e.getX(), e.getY() ,this ).getX()));
}

public static void main(String[] args) {
Hello h1 = new Hello();
h1.setVisible(true);
}


}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

convertPointという機能を使うということですね。
大変有効な方法です。

お礼日時:2011/04/18 11:34

>ちなみに、JLabelにもmouseMovedをつけると、


>取得する座標が、JLabel上の座標になってしまいます。

JLabelの位置はわかるのですから、取得した座標に加算すればいいだけではないでしょうか。

あるいは、JPanelだけですべて処理したいのであれば、JLabelを使わず、すべてグラフィックとして描画し処理する、という形になるでしょう。JLabelを使っている理由が、単純にテキストを表示するだけということなら、描画に置き換えてもそれほど大変ではないように思えます。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。

お礼日時:2011/04/18 11:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qボタンの複数割り当てについて

public class TestButton extends Applet implements ActionListener
{
     Button bt1,bt2,bt3;

     public void init()
     {
         bt1 = new Button("red");
         add(bt1);
         bt2 = new Button("blue");
         add(bt2);
         bt3 = new Button("yellow");
         add(bt3);
         bt1.addActionListener(this);
      }

java初心者です。アプレットで上のようにボタンを作ります。それぞれが押された時に、red,blue,yellowが表示されるようにしたいのです。ActionListenerをインプリメントしているので、

     public void actionPerformed(ActionEvent ae)

をオーバーライドする必要がありますが、そこで質問です。
ボタンを3種類別々に関連づけるには、actionPerformed内をどのように記述したらよいでしょうか?また、init内はこれだけでいいんでしょうか?
よろしくお願いします。

public class TestButton extends Applet implements ActionListener
{
     Button bt1,bt2,bt3;

     public void init()
     {
         bt1 = new Button("red");
         add(bt1);
         bt2 = new Button("blue");
         add(bt2);
         bt3 = new Button("yellow");
         add(bt3);
         bt1.addActionListener(this);
      }

java初心者です。アプレットで上のようにボタン...続きを読む

Aベストアンサー

これは色々やり方があります。
ボタンをメンバ変数として定義してActionEventの
getSource()メソッドでEventが発生したObjectと
比較するとか、getSource()で取得したオブジェクト
をButtonにキャストしてからgetLabel()でラベルの
文字列を取得し任意の文字列と比較するとか。
他にはアクションコマンドで分岐する方法もあります。

・メンバ変数の例

public class TestButton extends Applet implements ActionListener {
  Button btn1,btn2,bt3;
  public void init(){
    btn1=new Button("red");
    add(btn1);
    btn2=new Button("blue");
    add(btn2);
    btn3=new Button("yellow");
    add(btn3);
  }
  public void actionPerformed(ActionEvent e){
    Object obj=e.getSource();
    if(obj == btn1){
      // "red"の処理
    }
    else if(obj == btn2){
      // "blue"の処理
    }
    else if(obj == btn3){
      // "yellow"の処理
    }
  }
}

・ラベルで比較する例

public void acitonPerformed(ActionEvent e){
  Object obj=e.getSource();
  if(obj instanceof Button){
    Button btn=(Button)obj;
    String labStr=btn.getLabel();
    if("red".equals(labStr)){
      // "red"の処理
    }
    else if("blue".equals(labStr)){
      // "blue"の処理
    }
    else if("yellow".equals(labStr)){
      // "yellow"の処理
    }
  }
}

・アクションコマンドの例

public void actionPerformed(ActionEvent e){
  String cmdName=e.getActionCommand();
  if("red".equals(cmdName)){
    // "red"の処理
  }
  else if("blue".equals(cmdName)){
    // "blue"の処理
  }
  else if("yellow".equals(cmdName)){
    // "yellow"の処理
  }
}

制約が無ければアクションコマンドでの処理が私は好きです。

これは色々やり方があります。
ボタンをメンバ変数として定義してActionEventの
getSource()メソッドでEventが発生したObjectと
比較するとか、getSource()で取得したオブジェクト
をButtonにキャストしてからgetLabel()でラベルの
文字列を取得し任意の文字列と比較するとか。
他にはアクションコマンドで分岐する方法もあります。

・メンバ変数の例

public class TestButton extends Applet implements ActionListener {
  Button btn1,btn2,bt3;
  public void init(){
    btn1=new Bu...続きを読む

Qjava リアルタイムでマウスの座標を取得したい

マウスのリアルタイム座標を取得したいのですが、
以下のソースを作りました。
しかし、リアルタイムどころか、マウスをクリックしても座標が取得できません

どこを修正すればいいのでしょうか?






import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.MouseEvent;
import java.net.URL;
importjava.awt.Image;

/*<applet code="applet001" width="640" height="480"></applet>*/

public class applet001 extends Applet implements MouseListener, MouseMotionListener
{
Dimension dim;

intmouse_x, mouse_y;

//アプレットの初期化時呼び出される
publicvoidinit()
{
dim = getSize();
addMouseListener( this );
}


publicvoidupdate(Graphics g) //オーバーライドして最低限のことだけをする
{
paint(g);
}
publicvoidpaint(Graphics g)
{
g.drawString( "マウス:" + mouse_x + "," + mouse_y, 60, 120 );
g.fillOval(mouse_x,mouse_y,30,30);
}


//マウスの処理
publicvoidmousePressed( MouseEvent e )
{
mouse_x = e.getX();
mouse_y = e.getY();
}
publicvoidmouseClicked( MouseEvent e )
{}
publicvoidmouseReleased( MouseEvent e )
{}
publicvoidmouseEntered( MouseEvent e )
{}
publicvoidmouseDragged( MouseEvent e )
{}
//
publicvoidmouseExited( MouseEvent e )
{}
//
publicvoidmouseMoved( MouseEvent e )
{
mouse_x = e.getX();
mouse_y = e.getY();
repaint();
}
}

マウスのリアルタイム座標を取得したいのですが、
以下のソースを作りました。
しかし、リアルタイムどころか、マウスをクリックしても座標が取得できません

どこを修正すればいいのでしょうか?






import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.MouseEvent;
import java.net.URL;
importjava.awt.Image;

/*<applet code="applet001" width="640" height="480"></applet>*/

public class applet001 extends Applet implements MouseListener, MouseMotio...続きを読む

Aベストアンサー

MouseMothionListenerの追加は、addMouseListener()ではなく、addMouseMotionListener()です。

Qjarファイルをダブルクリックで実行

jarファイルをコマンドプロンプトから実行することは可能なのですが
ダブルクリックをすると「could not find class.program will exit」という
メッセージが出て実行できません。
自分の作ったファイルが悪いのかと思い
http://cafe.justsystem.co.jp/Tips/javaapp/helloworldicojar/#execfail
で紹介されているHelloWorld.jarもダブルクリックでは実行することが出来ませんでした。

ダブルクリックで実行するためには何か特別な設定をする必要があるのでしょうか?
自分なりに過去ログを見たのですがわからないのでよろしくお願いします。

Aベストアンサー

>jarファイルの関連付けは「Java(TM) 2 Platform Standard Edition binary」となっています

もっと詳細に調べる。

「フォルダオプション」

「ファイルの種類」

拡張子「JAR」を選択した状態で「詳細設定」

アクション「open」を「編集」

「アクションを実行するアプリケーション」
のところに書かれている"コマンド"が
適切かどうかチェックする。


それを#1さんのリンク先の内容と照らし合わせる。


人気Q&Aランキング

おすすめ情報