/* * Copyright (c) 1996, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/** * A class to encapsulate the bitmap representation of the mouse cursor. * * @see Component#setCursor * @author Amy Fowler
*/ publicclass Cursor implements java.io.Serializable {
/** * The default cursor type (gets set if no cursor is defined).
*/ publicstaticfinalint DEFAULT_CURSOR = 0;
/** * @deprecated As of JDK version 1.7, the {@link #getPredefinedCursor(int)} * method should be used instead.
*/
@Deprecated protectedstatic Cursor[] predefined = new Cursor[14];
/** * This field is a private replacement for 'predefined' array.
*/ privatestaticfinal Cursor[] predefinedPrivate = new Cursor[14];
/** * Initialize JNI field and method IDs for fields that may be * accessed from C.
*/ privatestaticnativevoid initIDs();
/** * Hook into native data.
*/ privatetransientlong pData;
privatetransient Object anchor = new Object();
staticclass CursorDisposer implements sun.java2d.DisposerRecord { volatilelong pData; public CursorDisposer(long pData) { this.pData = pData;
} publicvoid dispose() { if (pData != 0) {
finalizeImpl(pData);
}
}
} transient CursorDisposer disposer; privatevoid setPData(long pData) { this.pData = pData; if (GraphicsEnvironment.isHeadless()) { return;
} if (disposer == null) {
disposer = new CursorDisposer(pData); // anchor is null after deserialization if (anchor == null) {
anchor = new Object();
}
sun.java2d.Disposer.addRecord(anchor, disposer);
} else {
disposer.pData = pData;
}
}
/** * The user-visible name of the cursor. * * @serial * @see #getName()
*/ protected String name;
/** * Returns a cursor object with the specified predefined type. * * @param type the type of predefined cursor * @return the specified predefined cursor * @throws IllegalArgumentException if the specified cursor type is * invalid
*/ publicstatic Cursor getPredefinedCursor(int type) { if (type < Cursor.DEFAULT_CURSOR || type > Cursor.MOVE_CURSOR) { thrownew IllegalArgumentException("illegal cursor type");
}
Cursor c = predefinedPrivate[type]; if (c == null) {
predefinedPrivate[type] = c = new Cursor(type);
} // fill 'predefined' array for backwards compatibility. if (predefined[type] == null) {
predefined[type] = c;
} return c;
}
/** * Returns a system-specific custom cursor object matching the * specified name. Cursor names are, for example: "Invalid.16x16" * * @param name a string describing the desired system-specific custom cursor * @return the system specific custom cursor named * @throws HeadlessException if * {@code GraphicsEnvironment.isHeadless} returns true * @throws AWTException in case of erroneous retrieving of the cursor
*/ publicstatic Cursor getSystemCustomCursor(final String name) throws AWTException, HeadlessException {
GraphicsEnvironment.checkHeadless();
Cursor cursor = systemCustomCursors.get(name);
if (cursor == null) {
loadSystemCustomCursorProperties();
if (!systemCustomCursorProperties.containsKey(key)) { if (log.isLoggable(PlatformLogger.Level.FINER)) {
log.finer("Cursor.getSystemCustomCursor(" + name + ") returned null");
} returnnull;
}
final String fileName =
systemCustomCursorProperties.getProperty(key);
final String localized = systemCustomCursorProperties.getProperty(
prefix + DOT_NAME_SUFFIX, name);
if (hotspot == null) thrownew AWTException("no hotspot property defined for cursor: " + name);
StringTokenizer st = new StringTokenizer(hotspot, ",");
if (st.countTokens() != 2) thrownew AWTException("failed to parse hotspot property for cursor: " + name);
final Point hotPoint; try {
hotPoint = new Point(Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()));
} catch (NumberFormatException nfe) { thrownew AWTException("failed to parse hotspot property for cursor: " + name);
} final Toolkit toolkit = Toolkit.getDefaultToolkit(); final String file = RESOURCE_PREFIX + fileName;
@SuppressWarnings("removal") final InputStream in = AccessController.doPrivileged(
(PrivilegedAction<InputStream>) () -> { return Cursor.class.getResourceAsStream(file);
}); try (in) {
Image image = toolkit.createImage(in.readAllBytes());
cursor = toolkit.createCustomCursor(image, hotPoint, localized);
} catch (Exception e) { thrownew AWTException( "Exception: " + e.getClass() + " " + e.getMessage() + " occurred while creating cursor " + name);
}
if (cursor == null) { if (log.isLoggable(PlatformLogger.Level.FINER)) {
log.finer("Cursor.getSystemCustomCursor(" + name + ") returned null");
}
} else {
systemCustomCursors.put(name, cursor);
}
}
return cursor;
}
/** * Return the system default cursor. * * @return the default cursor
*/ publicstatic Cursor getDefaultCursor() { return getPredefinedCursor(Cursor.DEFAULT_CURSOR);
}
/** * Creates a new cursor object with the specified type. * @param type the type of cursor * @throws IllegalArgumentException if the specified cursor type * is invalid
*/
@ConstructorProperties({"type"}) public Cursor(int type) { if (type < Cursor.DEFAULT_CURSOR || type > Cursor.MOVE_CURSOR) { thrownew IllegalArgumentException("illegal cursor type");
} this.type = type;
// Lookup localized name.
name = Toolkit.getProperty(cursorProperties[type][0],
cursorProperties[type][1]);
}
/** * Creates a new custom cursor object with the specified name.<p> * Note: this constructor should only be used by AWT implementations * as part of their support for custom cursors. Applications should * use Toolkit.createCustomCursor(). * @param name the user-visible name of the cursor. * @see java.awt.Toolkit#createCustomCursor
*/ protected Cursor(String name) { this.type = Cursor.CUSTOM_CURSOR; this.name = name;
}
/** * Returns the type for this cursor. * * @return the cursor type
*/ publicint getType() { return type;
}
/** * Returns the name of this cursor. * @return a localized description of this cursor. * @since 1.2
*/ public String getName() { return name;
}
/** * Returns a string representation of this cursor. * @return a string representation of this cursor. * @since 1.2
*/ public String toString() { return getClass().getName() + "[" + getName() + "]";
}
/* * load the cursor.properties file
*/
@SuppressWarnings("removal") privatestaticvoid loadSystemCustomCursorProperties() throws AWTException { synchronized (systemCustomCursors) { if (systemCustomCursorProperties != null) { return;
}
systemCustomCursorProperties = new Properties();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.