Como faço um "xeyes" em Java?

Isso é porque estou com preguiça de procurar na documentação :stuck_out_tongue:

Estava esperando o servidor de aplicação subir e iniciei aquele programa do X (xeyes) e fiquei curioso.
Para quem não conhece, o xeyes é um programa que mostra dois olhos que ficam mirando o cursor, em qualquer posição em que ele esteja na tela.

No Windows isso é fácil de fazer em um programa C++ porque basta capturar o mouse, e determinar as coordenadas.

Será que é fácil fazer algo equivalente em Java?

Usando AWT ou Swing, é lógico - acho que SWT deve ter alguma coisa semelhante à função de capturar o mouse porque é um encapsulamento fino sobre as APIs gráficas, portanto não conta.

		addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseMoved(MouseEvent evt) {
				evt.getX();
				evt.getY();
			}
		});

Agora pra ficar os olhinhos na tela e tudo mais é outra história… :twisted:

Tbm tinha pensado nisso , mas olhos ficam na posição do mouse? ou entendi errado

[quote=RaulCarlin] addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent evt) { evt.getX(); evt.getY(); } });

Agora pra ficar os olhinhos na tela e tudo mais é outra história… :twisted: [/quote]

o problema maior n eh a captura dos movimentos em si, mas como "jogar" na tela os olhos ( ou na area de trabalho)
de qlq forma é possível fazer esse xeyes sim, tinha um feito em C++ mas graças ao meu amado irmão tive q formatar o pc e … :roll:
(pq q eu n aprendi a fazer backup antes :cry: :cry: )
se quiser dps t passo mais ou menos a maneira q eu fiz ok :wink:

O “jogar” na tela é utilizar a tela como painel para os olhos :stuck_out_tongue:

[]'s

O problema com MouseMotionListener é que ele só retorna a posição do mouse se o mesmo se encontra em cima do componente em questão.

Fuçando a implementação do método Component.getMousePosition() vi que Java 1.5 vem com a classe MouseInfo com que dá para pegar a posição do mouse em qualquer lugar da tela (além de outras informações sobre o mouse).

http://java.sun.com/j2se/1.5.0/docs/api/java/awt/MouseInfo.html

[]s,
Sami

Ah, não pude resistir… uma implementação PoC rápido e tosco utilizando um JFrame com setDecorated(false):

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class XEyes extends JFrame implements Runnable {
    private static final int BORDER = 3;
    private static final int EYE_DIAMETER = 22;
    private static final int EYE_RADIUS = EYE_DIAMETER / 2;
    private static final int PUPIL_DIAMETER = 8;
    private static final int PUPIL_RADIUS = PUPIL_DIAMETER / 2;
    private static final int EYE_DISTANCE = 10;
    private static final int LEFT_EYE_X = EYE_RADIUS + BORDER;
    private static final int LEFT_EYE_Y = EYE_RADIUS + BORDER;
    private static final int RIGHT_EYE_X = LEFT_EYE_X + EYE_DIAMETER + EYE_DISTANCE;
    private static final int RIGHT_EYE_Y = EYE_RADIUS + BORDER;
    
    private final Cursor normalCursor;
    private final Cursor moveCursor = new Cursor(Cursor.MOVE_CURSOR);
    
    private Point lastPt = null;
    
    private Point mouseDown = null;
    private JPanel eyePanel;
    
    public XEyes() {
        super();
        setUndecorated(true);
        setAlwaysOnTop(true);
        this.eyePanel = new JPanel() {
            public void paint(Graphics g) {
                paintEyes(g);
            }
        };
        
        this.eyePanel.setPreferredSize(new Dimension(RIGHT_EYE_X + EYE_RADIUS + BORDER, LEFT_EYE_Y + EYE_RADIUS + BORDER));
        normalCursor = this.eyePanel.getCursor();
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(eyePanel, BorderLayout.CENTER);
        // allow dragging the window
        this.eyePanel.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                eyePanel.setCursor(moveCursor);
                mouseDown = e.getPoint();
            }

            public void mouseReleased(MouseEvent e) {
                eyePanel.setCursor(normalCursor);
                Point pt = e.getPoint();
                pt.translate(-mouseDown.x, -mouseDown.y);
                Point location = getLocation();
                location.translate(pt.x, pt.y);
                setLocation(location);
            }
            
        });
        Thread t = new Thread(this);
        t.start();
        pack();
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new XEyes();
    }
    
    public void paintEyes(Graphics g) {
        if (this.lastPt == null) {
            this.lastPt = MouseInfo.getPointerInfo().getLocation();
        }
        
        // graphics
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        g2.setColor(Color.WHITE);
        g2.clearRect(0, 0, this.eyePanel.getWidth(), this.eyePanel.getHeight());
        
        Ellipse2D ellipse = new Ellipse2D.Double(LEFT_EYE_X - EYE_RADIUS, LEFT_EYE_Y - EYE_RADIUS, EYE_DIAMETER, EYE_DIAMETER);
        g2.setColor(Color.BLACK);
        g2.draw(ellipse);
        float dx = lastPt.x - this.getX()- LEFT_EYE_X;
        float dy = lastPt.y - this.getY() - LEFT_EYE_Y;
        float dsize = Math.max(1, Math.max(Math.abs(dx), Math.abs(dy)));
        dx *= (EYE_RADIUS - PUPIL_RADIUS - 1) / dsize;
        dy *= (EYE_RADIUS - PUPIL_RADIUS - 1) / dsize;
        Ellipse2D center = new Ellipse2D.Double(LEFT_EYE_X - PUPIL_RADIUS + dx, LEFT_EYE_Y - PUPIL_RADIUS + dy, PUPIL_DIAMETER, PUPIL_DIAMETER);
        g2.fill(center);

        ellipse = new Ellipse2D.Double(RIGHT_EYE_X - EYE_RADIUS, RIGHT_EYE_Y - EYE_RADIUS, EYE_DIAMETER, EYE_DIAMETER);
        g2.setColor(Color.BLACK);
        g2.draw(ellipse);
        dx = lastPt.x - this.getX() - RIGHT_EYE_X;
        dy = lastPt.y - this.getY() - RIGHT_EYE_Y;
        dsize = Math.max(1, Math.max(Math.abs(dx), Math.abs(dy)));
        dx *= (EYE_RADIUS - PUPIL_RADIUS - 1) / dsize;
        dy *= (EYE_RADIUS - PUPIL_RADIUS - 1) / dsize;
        center = new Ellipse2D.Double(RIGHT_EYE_X - PUPIL_RADIUS + dx, RIGHT_EYE_Y - PUPIL_RADIUS + dy, PUPIL_DIAMETER, PUPIL_DIAMETER);
        g2.fill(center);

    }

    public void run() {
        while(true) {
            Point newPt = MouseInfo.getPointerInfo().getLocation();
            // only paint if the mouse has moved
            if (this.lastPt == null || !newPt.equals(this.lastPt)) {
                this.lastPt = newPt;
                this.eyePanel.repaint();                
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

ficou da hora sami :smiley:
parabéns cara

em tempo: procurei algumas implementações de XEyes no Google http://groups.google.com.br/grphp?ie=UTF-8&oe=UTF-8&hl=pt-BR&tab=wg&q= e pude notar que muitos utilizam retas que ligam os olhos ao cursor (o q eh dah até um certo aspecto estrábico nos coitados dos olhos hehe :wink:
mas com este método que o Sami disse fica bem mais fácil ^^

[]'s

Parabéns, Sami.
É exatamente isso (MouseInfo) - sabia que devia haver alguma coisa pronta.
Agora, chamar o seu programa de implementação “PoC”? Deixe de ser modesto.

Eu do meu lado estava meio que apostando que não haveria um jeito, porque a última vez que tentei fazer isso (pegar a posição do mouse) era na época de java 1.4 ou até 1.3 e eu não consegui achar um jeito de fazer isso.

Agora vejo que isto pode ser interpretado de um modo que não era minha intenção. Só para evitar que alguém entende errado, o que eu quis dizer foi “Proof of Concept” ou seja, prova de conceito e não “piece of crap” (ou outra coisa do gênero :smiley: ). E realmente foi isso, testando o conceito de pegar a posição do mouse, da janela num thread e baseado nisso desenhar os olhos. Básicamente só quis dizer que o código está com bugs eu tenho preguiça de correr atrás e corrigir :slight_smile:

[]s,
Sami

Sami, fiquei com inveja de você e implementei a minha versão do xeyes

Dem uma olhada :smiley:
É um projeto do netbeans.

Ao abrir, cliquem duas vezes nos olhos.

Usei uma abordagem mais simples, utilizando o método atan2 da classe Math.

Fonte incluso :smiley:

:smiley: Ficou muito legal, David. Usar atan2 realmente é uma solução mais elegante. É que eu nunca consigo lembrar bem da matemática envolvida e estava com preguiça de encontrar um exemplo de como fazer e por isso optei para aquela bagunça que fiz. :oops:

Realmente a sua é uma versão superior em todos os aspectos. Parabéns. :slight_smile:

[]s,
Sami

Obrigado Sami :smiley:

Até mais!

caras, parabens pela criatividade e dedicação, mesmo alguns de vcs se intitulando preguisosos, que nao acho, cheguei aqui procurando como capturar a posicao do mouse, mas procuro algo mais simples, como System.out.print(mouse.x); Entendem? para no futuro montar algo como isso que fiz em flash: http://www.memphisnet.com.br/prototipos/pontosMedicos/
nao esquecam de dar cliques na tela.