From window, to wind

趣味のゲームとJavaプログラムなどについて 適当に書き綴るブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

マウスの位置を表示するウィンドウ

マウスがある付近をキャプチャーして表示するプログラムです。いくつか参考になる部分もあると思います。あと他にGBLayoutクラスを用いています。
MouseWatcher.jpg

ソースコード
メインクラス

package program;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Hashtable;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class MainRun {
   
    static JDialog jd;
    static WatcherLabel wl;
    static JSlider js;
    static JButton jb;
   
    public static void main(String[] args) {
       
        jd = new JDialog();
       
        Dimension size = new Dimension(200,200);
       
        int msec = 500;
       
        wl = new WatcherLabel(jd,size,msec);
       
        js = new JSlider(1, 5, wl.getXnum());
        js.setPreferredSize(new Dimension(size.width/2,50));
        js.setMajorTickSpacing(1);
        Hashtable<Integer, JComponent> table = new Hashtable<Integer, JComponent>();
        table.put(new Integer(1), new JLabel("1倍"));
        table.put(new Integer(2), new JLabel("2倍"));
        table.put(new Integer(3), new JLabel("3倍"));
        table.put(new Integer(4), new JLabel("4倍"));
        table.put(new Integer(5), new JLabel("5倍"));
        js.setLabelTable(table);
        js.setPaintTicks(true);
        js.setSnapToTicks(true);
        js.setPaintLabels(true);
        js.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                wl.setXnum(js.getValue());
            }
        });
       
        jb = new JButton("Close");
        jb.setPreferredSize(new Dimension(size.width/2,50));
        jb.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jd.dispose();
                System.exit(0);
            }
        });
       
        GBLayout.addGB(wl, jd.getContentPane(), 0, 0, 1, 2);
        GBLayout.addGB(js, jd.getContentPane(), 0, 1, 1, 1);
        GBLayout.addGB(jb, jd.getContentPane(), 1, 1, 1, 1);
       
        //タイトルのバーの非表示
        jd.setUndecorated(true);
        //常に前面に表示
        jd.setAlwaysOnTop(true);
        jd.pack();
        jd.setLocation(300, 300);
        jd.setVisible(true);
    }

}



表示ラベルクラス



package program;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;

import javax.swing.JDialog;
import javax.swing.JLabel;

public class WatcherLabel extends JLabel
implements MouseListener,MouseMotionListener,Runnable{

    private JDialog jd;
    private Thread th;
    private int msec=1000;
    private Point p0,p1,pnow;
    private PointerInfo pointerInfo;
    private Point mousep;
    private Robot robot;
    private BufferedImage img;
    private Dimension size;
    private int Xnum=1;
   
    WatcherLabel(JDialog jd, Dimension size, int msec){
        this.jd=jd;
        setPreferredSize(size);
        this.msec=msec;
        this.size=size;
       
        addMouseListener((MouseListener) this);
        addMouseMotionListener((MouseMotionListener) this);
       
        th = new Thread(this);
        th.start();
    }

    public void setXnum(int bairitu){
        Xnum=bairitu;
    }
    public int getXnum(){
        return(Xnum);
    }
    public void paint(Graphics g) {
        //画像の貼り付け
        if (img != null) {
            g.drawImage(img,0,0,size.width,size.height,this);
        }
       
        //中心線の描画
        g.setColor(Color.red);
        g.drawLine(0, size.height/2, size.width, size.height/2);
        g.drawLine(size.width/2, 0, size.width/2, size.height);
       
        //枠の描画
        g.setColor(Color.blue);
        g.drawRect(0, 0, size.width-1, size.height-1);
        g.drawRect(1, 1, size.width-3, size.height-3);
    }
   
    public void mouseClicked(MouseEvent me) {
        // TODO 自動生成されたメソッド・スタブ
       
    }

    public void mouseEntered(MouseEvent me) {
        // TODO 自動生成されたメソッド・スタブ
       
    }

    public void mouseExited(MouseEvent me) {
        // TODO 自動生成されたメソッド・スタブ
       
    }

    public void mousePressed(MouseEvent me) {
        // TODO 自動生成されたメソッド・スタブ
        p0=me.getPoint();
       
    }

    public void mouseReleased(MouseEvent me) {
        // TODO 自動生成されたメソッド・スタブ
        p1=me.getPoint();
        pnow=jd.getLocation();
        jd.setLocation(pnow.x+p1.x-p0.x,pnow.y+p1.y-p0.y);
        getImage();
    }

    public void mouseDragged(MouseEvent me) {
        // TODO 自動生成されたメソッド・スタブ
        p1=me.getPoint();
        pnow=jd.getLocation();
        jd.setLocation(pnow.x+p1.x-p0.x,pnow.y+p1.y-p0.y);
        getImage();
    }

    public void mouseMoved(MouseEvent me) {
        // TODO 自動生成されたメソッド・スタブ
       
    }

    private void getImage(){
        pointerInfo = MouseInfo.getPointerInfo();
        mousep = pointerInfo.getLocation();
        try {
            robot = new Robot();
            img = robot.createScreenCapture(new Rectangle(mousep.x-size.width/2/Xnum,mousep.y-size.height/2/Xnum,size.width/Xnum,size.height/Xnum));
            repaint();
        } catch (AWTException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }
   
    public void run() {
        try {
            while(true){
                Thread.sleep(msec);
                getImage();
            }
        }catch(Exception e){
           
        }
    }
}



解説
JDialogに表示用のWatcherLabelと拡大倍率のJSliderと終了用のJButtonを用いたプログラムです。前述のGBLayoutクラスを用いてコンポーネントを配置しています。
JFrameではなくJDialogを用いたのは、タスクバーに表示させないためです。またタイトルバーとかも邪魔なのでsetUndecorated(true)で消してあります。常にマウスを監視するため最前面に表示するようにsetAlwaysOnTop(true)を使っています。

タイトルバーがないのでJDialogを移動できないので、WatcherLabelにマウスイベントを渡し、マウスでドラッグすると一緒にJDialogを移動するようにしています。

マウスの座標を受け取るため
pointerInfo = MouseInfo.getPointerInfo();
mousep = pointerInfo.getLocation();
で画面上の絶対座標を受け取ります。この方法だとコンポーネント以外の場所のマウスの座標を得ることができます。

画面をRobotクラスでキャプチャーし、マウスの座標の周辺を選択します。

ほかのプログラムにも利用できるものがあると思います。
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://kagenyan.blog69.fc2.com/tb.php/20-fc6576f9
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。