In Swing, is there a way to extract a predefined m

2020-02-14 07:22发布

问题:

I'd like to make a custom help cursor by "badging" the built-in default mouse cursor with a question mark when the user is hovering over an object that can be clicked for context-sensitive help. I'd like this to work nicely across platforms/look-and-feels (to look consistent with the white Windows mouse and the black Mac mouse, for instance.) Is there a way to get the cursor Image from the current Toolkit so that I could generate a combined Image to set as the cursor?

This question points out that the information can't be gotten from the Cursor object. There's also a comment there that suggested fishing around in the JRE, which I've also tried a bit: There and in google images, I didn't find any straightforwardly accessible graphics files to plunder

An alternative would be to add a mouseMoved listener and draw manually a little to the right of the cursor (on the parent, I suppose, to avoid clipping at the borders?) but I was a bit concerned about overhead, and in initial explorations, this was looking very complicated. I'd take other suggestions about finding or making a nice help cursor as well. (The hand is the best built-in, but it doesn't say "help" as clearly as a question-mark.)

回答1:

I'm not sure this is the best solution in your case, because a good built-in mouse cursor should be the best. Anyway you can use mouse listeners and draw on a glasspane according to the mouse position. Here's a glasspane drawing example.



回答2:

In general, no. Most cursors are owned by the platform's host operating system, but a few live in $JAVA_HOME/lib/images/cursors/, for example:

$ ls -1 lib/images/cursors/
cursors.properties
invalid32x32.gif
motif_CopyDrop32x32.gif
motif_CopyNoDrop32x32.gif
motif_LinkDrop32x32.gif
motif_LinkNoDrop32x32.gif
motif_MoveDrop32x32.gif
motif_MoveNoDrop32x32.gif


回答3:

Java uses the default system cursor except for the Drag-and-Drop cursor, where it is using it's own cursors.

So for every cursors but DnD, refer to Extract cursor image in Java . JNA has to be used and can be easily added to any Maven project.

For DnD cursors, the solution from trashgod is good. They can be loaded this way:

private static Path customSystemCursorPath = null;

public static Image loadDnDCursorImage(String cursorName) throws IOException {

    if (customSystemCursorPath == null) {
        String jhome = System.getProperty("java.home", "????");
        customSystemCursorPath = Paths.get(jhome, "lib", "images", "cursors");
    }

    // TODO change this to retrieve the cursor filename from  cursors.properties
    cursorName = "win32_" + cursorName + "32x32.gif";

    Path cursorPath = customSystemCursorPath.resolve(cursorName);

    Image image = ImageIO.read(cursorPath.toFile());
    return image;
}