マウスカーソルをマウスイベント毎に変更
自作のJavaアプリの使い方を説明する動画を作ろうと思ったのですが、動画だけではマウスのどのボタンを押したのか、見せることができません。
そこで、マウスカーソルをマウスイメージに置き換え、マウスキーやホイールを操作するごとにイメージを差し替えてマウスの操作状況をわかるようにしようと考えました。
マウスカーソルをイメージに差し替えるのは簡単だったのですが、マウスの操作イベントでイメージを差し替えるのは大変でした。
なぜなら、
Java
楽天 のイベントはコンポーネントごとに設定しなければいけないので、
パネル、ボタン楽天 ...とマウスが上に乗るコンポーネントすべてにイベントを設定しなければいけません(普通は)。
フレーム上のすべての場所でマウスイベントを一括して設定する方法
よく調べてみたら、うまく設定する方法がありましたが、ネット上にわかりやすい情報がなかったので上げておきます。
マウスイベントだけでなく、キーイベントでも設定できます。
Toolkit.addAWTEventListener()を利用します。下のソースでは、設定したフレーム内であればマウスカーソルが変わってくれます。
動画で見るとこんな感じ
ソースは下記になります。
package tomojavalib.test;
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import tomojavalib.p2cad.Frame;
public class MouseCursor extends JFrame{
Cursor cc=null;
Cursor cd=null;
Cursor cu=null;
Cursor cl=null;
Cursor cr=null;
Cursor ch=null;
JPanel p = null;
JButton button = null;
public MouseCursor()
{
p = new JPanel();
p.setBackground(Color.WHITE);
button = new Jbutton( "test" );
p.add( button );
Container contentPane = getContentPane();
contentPane.add( p, BorderLayout.CENTER );
mouseHenkou();
initEventListener();
}
public static void main(String[] args) {
MouseCursor m = new MouseCursor();
m.setSize(640,480);
m.setBackground(Color.WHITE);
m.setVisible(true);
}
public void mouseHenkou() {
java.io.File f = null;
Image img=null;
Image imgd=null;
Image imgu=null;
Image imgl=null;
Image imgr=null;
Image imgh=null;
/*ファイル読み込み*/
try {
f = new java.io.File( "Z:\\work\\java\\tomojavalib\\src\\tomojavalib\\p2cad\\mouse.jpg" );
img = (Image)javax.imageio.ImageIO.read( f );
f = new java.io.File( "Z:\\work\\java\\tomojavalib\\src\\tomojavalib\\p2cad\\mouse-d.jpg" );
imgd = (Image)javax.imageio.ImageIO.read( f );
f = new java.io.File( "Z:\\work\\java\\tomojavalib\\src\\tomojavalib\\p2cad\\mouse-u.jpg" );
imgu = (Image)javax.imageio.ImageIO.read( f );
f = new java.io.File( "Z:\\work\\java\\tomojavalib\\src\\tomojavalib\\p2cad\\mouse-l.jpg" );
imgl = (Image)javax.imageio.ImageIO.read( f );
f = new java.io.File( "Z:\\work\\java\\tomojavalib\\src\\tomojavalib\\p2cad\\mouse-r.jpg" );
imgr = (Image)javax.imageio.ImageIO.read( f );
f = new java.io.File( "Z:\\work\\java\\tomojavalib\\src\\tomojavalib\\p2cad\\mouse-h.jpg" );
imgh = (Image)javax.imageio.ImageIO.read( f );
}catch (Exception e) { e.printStackTrace(); }
cc = Toolkit.getDefaultToolkit().createCustomCursor(img, new java.awt.Point(), "");
cd = Toolkit.getDefaultToolkit().createCustomCursor(imgd, new java.awt.Point(), "");
cu = Toolkit.getDefaultToolkit().createCustomCursor(imgu, new java.awt.Point(), "");
cl = Toolkit.getDefaultToolkit().createCustomCursor(imgl, new java.awt.Point(), "");
cr = Toolkit.getDefaultToolkit().createCustomCursor(imgr, new java.awt.Point(), "");
ch = Toolkit.getDefaultToolkit().createCustomCursor(imgh, new java.awt.Point(), "");
this.setCursor(cc);
return;
}
private void initEventListener() {
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
public void eventDispatched(AWTEvent event) {
if(event.getID() == MouseWheelEvent.MOUSE_WHEEL) {
MouseWheelEvent e = (MouseWheelEvent) event;
if( e.getWheelRotation()>0 ){ setCursor( "d" ); }else{ setCursor( "u" ); }
}
if(event.getID() == MouseEvent.MOUSE_MOVED) { setCursor( "c"); }
if(event.getID() == MouseEvent.MOUSE_PRESSED) {
MouseEvent e = (MouseEvent)event;
if( e.getButton()==MouseEvent.BUTTON1 ){setCursor( "l");}
if( e.getButton()==MouseEvent.BUTTON2 ){setCursor( "h");}
if( e.getButton()==MouseEvent.BUTTON3 ){setCursor( "r");}
}
}
}, AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_WHEEL_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);
}
private void setCursor( String s ){
System.out.println("イベント");
if( s.equals("d") ){ this.setCursor(cd); }
else if( s.equals("u") ){ this.setCursor(cu); }
else if( s.equals("c") ){ this.setCursor(cc); }
else if( s.equals("r") ){ this.setCursor(cr); }
else if( s.equals("l") ){ this.setCursor(cl); }
else if( s.equals("h") ){ this.setCursor(ch); }
}
}
最終更新日: 2018-12-21 08:44:39