/*
* This is free and unencumbered software released into the public domain.
*
* Anyone is free to copy, modify, publish, use, compile, sell, or
* distribute this software, either in source code form or as a compiled
* binary, for any purpose, commercial or non-commercial, and by any
* means.
*
* In jurisdictions that recognize copyright laws, the author or authors
* of this software dedicate any and all copyright interest in the
* software to the public domain. We make this dedication for the benefit
* of the public at large and to the detriment of our heirs and
* successors. We intend this dedication to be an overt act of
* relinquishment in perpetuity of all present and future rights to this
* software under copyright law.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* For more information, please refer to <http://unlicense.org/>
*/
package javafx.embed.swt;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Objects;
import javafx.scene.control.Tooltip;
import javafx.util.Duration;
/**
* SWT-JavaFX初始化
*
* @author AqD
*/
public final class FXInitializer
{
/**
* 初始化JavaFX
*/
public static void initialize()
{
try
{
if (FXCanvas_initFx == null)
{
FXCanvas_initFx = FXCanvas.class.getDeclaredMethod("initFx");
FXCanvas_initFx.setAccessible(true);
}
FXCanvas_initFx.invoke(null);
}
catch (ReflectiveOperationException e)
{
throw new RuntimeException(e);
}
}
/**
* 設定提示功能的延遲時間
*
* @param openDelayInMillis 預設1000
* @param visibleDurationInMillis 預設5000
* @param closeDelayInMillis 預設200
* @author Karthik Shiraly http://www.coderanch.com/t/622070/JavaFX/java/control-Tooltip-visible-time-duration
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void setupCustomTooltipBehavior(
int openDelayInMillis, int visibleDurationInMillis, int closeDelayInMillis)
{
try
{
Class TTBehaviourClass = null;
Class[] declaredClasses = Tooltip.class.getDeclaredClasses();
for (Class c : declaredClasses)
{
if (c.getCanonicalName().equals("javafx.scene.control.Tooltip.TooltipBehavior"))
{
TTBehaviourClass = c;
break;
}
}
Objects.requireNonNull(TTBehaviourClass);
Constructor constructor = TTBehaviourClass.getDeclaredConstructor(
Duration.class, Duration.class, Duration.class, boolean.class);
assert (constructor != null);
constructor.setAccessible(true);
Object newTTBehaviour = constructor.newInstance(
new Duration(openDelayInMillis), new Duration(visibleDurationInMillis),
new Duration(closeDelayInMillis), false);
assert (newTTBehaviour != null);
Field ttbehaviourField = Tooltip.class.getDeclaredField("BEHAVIOR");
assert (ttbehaviourField != null);
ttbehaviourField.setAccessible(true);
// Cache the default behavior if needed.
// Object defaultTTBehavior = ttbehaviourField.get(Tooltip.class);
ttbehaviourField.set(Tooltip.class, newTTBehaviour);
}
catch (ReflectiveOperationException e)
{
throw new RuntimeException(e);
}
}
private static Method FXCanvas_initFx;
private FXInitializer()
{
}
}