System Cursor ändern

Romsl

Erfahrenes Mitglied
Hallo Zusammen,

Gibt es in Java derzeit die Möglichkeit den System Cursor auch über einen JFrame hinaus zu verändern? Sollte das nicht funktionieren, kann man dann an den Cursor ein Image anhängen?

Grüße,
-- Roman
 
Howdie.

Soweit ich weiß, ist es nicht möglich, System-Konfigurationen (wie den Cursor z.B.) außerhalb der JVM zu beeinflussen. Kann mich aber natürlich auch täuschen...

Gruß
miffi
 
Hi!
Mit einfachen Java Mittel ist das imho nicht machbar. Das müsste man dann über JNA lösen..

Grüße!
 
Artorius hat natürlich recht, über ein JNA/JNI-Interface zu System-Bibliotheken und -Funktionen könntest du das bestimmt lösen. Hierbei ist halt zu beachten, dass du dieses für mehrere Plattformen implementieren solltest. Die Verwendung von Java macht wenig Sinn, wenn man dann doch plattformspezifischen Code entwickelt.

Vielleicht findest du ja eine Lösung und postest sie hier, wäre bestimmt interessant.

Gruß
miffi
 
Hallo,

also du kannst ein gif oder ein png als Cursor über deinem JFrame anzeigen lassen.

Gruß

Sascha


EDIT:

Hab mich verlesen. Dachte nur über dem JFrame. ;-)
 
@Sascha:
Seine Frage war ja, ob er den Cursor auch außerhalb der JFrame-Grenzen verändern kann.
 
Nehme doch ein JFrame mit der Größe 1 Pixel, lasse es immer unter der Mausposition und setze dann dort den Mauszeiger.
Dann musst du noch das Fenster als alwaysOnTop setzen und eventuelle Klicks abfangen.
Für die Klicks kannst du die Verschiebe-Funktion kurz außer Kraft setzen und dann mit Robot ein Pixel daneben klicken.
Es ist keine perfekte Lösung, aber doch ganz nett. ;)

[EDIT]
Du solltest dann noch in das Fenster ein Pixel des Bildschirms zeichnen, den Screenshot bekommst du auch über Robot.
 
Hallo Zusammen,

Ein Beispiel wie ein Image an einen Cursor (auf Systemebene) angehängt werden kann. Es ist nicht perfekt, erfüllt dennoch seinen Zweck.

Grüße,
-- Roman

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JWindow;

import org.junit.Ignore;

import de.ukn.hci.squidy.designer.util.ImageUtils;

/**
 * 
 */

/**
 * <code>SystemCursorTest</code>.
 *
 * <pre>
 * Date: 10.05.2010
 * Time: 10:33:59
 * </pre>
 * 
 * @author Roman R&auml;dle, <a
 *         href="mailto:Roman.Raedle@uni-konstanz.de">Roman.Raedle@uni-konstanz.de</a>,
 *         University of Konstanz
 * @version $Id$
 * @since 1.5.0
 */
@Ignore
public class SystemCursorTest extends JWindow {

	/**
	 * Generated serial version UID.
	 */
	private static final long serialVersionUID = 3715223106647723777L;

	public static void main(String[] args) {
		new SystemCursorTest().setVisible(true);
	}
	
	public SystemCursorTest() {
		setAlwaysOnTop(true);
		
		try {
			BufferedImage image = ImageUtils.loadImageFromClasspath("/de/ukn/hci/squidy/extension/basic/image/16x16/presentation_chart.png");
			
//			AWTUtilities.setWindowShape(this, ImageUtils.getShapeOfImage(image));
//			AWTUtilities.setComponentMixingCutoutShape(this, ImageUtils.getShapeOfImage(image));
//			AWTUtilities.setWindowOpacity(this, 0.5f);
			
			JLabel label = new JLabel(new ImageIcon(image));
			this.setLayout(new BorderLayout());
			this.add(label, BorderLayout.CENTER);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.setSize(new Dimension(16, 16));
		this.setPreferredSize(new Dimension(16, 16));
		
		new Thread() {

			/* (non-Javadoc)
			 * @see java.lang.Thread#run()
			 */
			@Override
			public void run() {
				super.run();
				
				while (true) {
					PointerInfo pointerInfo = MouseInfo.getPointerInfo();
					Point p = pointerInfo.getLocation();
					setLocation((int) p.getX() + 10, (int) p.getY() + 15);
					
					try {
						sleep(16);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}.start();
	}
}
 
Das ist eine sehr ähnliche Variante wie die, die ich erklärt habe.
(Unterschied: Du zeichnest auf ein JWindow, ich setze einen Cursor auf das JWindow)

Bei deiner Lösung gibt es eben noch das Problem, dass halb transparente Cursor nicht transparent gezeichnet werden, daher vermutlich der Code in Zeile 53-55.

Hier dein Code in etwas veränderter Form.
Vorsicht, man kann nicht mehr klicken, also bitte das Programm per Tastatur beenden.
Java:
import java.awt.Dimension;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JWindow;
 
 
public class SystemCursorTest extends JWindow {
    public static void main(String[] args) {
        new SystemCursorTest().setVisible(true);
    }
    public SystemCursorTest() {
        setAlwaysOnTop(true);
        JLabel label = new JLabel(new ImageIcon("image.png"));
        this.setCursor(Toolkit.getDefaultToolkit().createCustomCursor(new ImageIcon("image.png").getImage(), new Point(0, 0), "customCursor"));
        this.setSize(new Dimension(1, 1));
        this.setPreferredSize(new Dimension(1, 1));
        new Thread() {
            public void run() {
                super.run();
                while (true) {
                    PointerInfo pointerInfo = MouseInfo.getPointerInfo();
                    Point p = pointerInfo.getLocation();
                    setLocation((int) p.getX(), (int) p.getY());
                    try {
                        sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
}
 
Zurück