WIP adding JavaFX utils/classes
This commit is contained in:
parent
a1a5b73c59
commit
a69dca4132
85
Dorkbox-Util/src/dorkbox/util/JavaFxUtil.java
Normal file
85
Dorkbox-Util/src/dorkbox/util/JavaFxUtil.java
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
package dorkbox.util;
|
||||||
|
|
||||||
|
import javafx.application.Platform;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.FutureTask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public
|
||||||
|
class JavaFxUtil {
|
||||||
|
|
||||||
|
public static final javafx.scene.text.Font DEFAULT_FONT = new javafx.scene.text.Font(13);
|
||||||
|
|
||||||
|
public static
|
||||||
|
void showOnSameScreenAsMouseCenter(javafx.stage.Window stage) {
|
||||||
|
Point mouseLocation = MouseInfo.getPointerInfo()
|
||||||
|
.getLocation();
|
||||||
|
|
||||||
|
GraphicsDevice deviceAtMouse = ScreenUtil.getGraphicsDeviceAt(mouseLocation);
|
||||||
|
Rectangle bounds = deviceAtMouse.getDefaultConfiguration()
|
||||||
|
.getBounds();
|
||||||
|
|
||||||
|
stage.setX(bounds.x + bounds.width / 2 - stage.getWidth() / 2);
|
||||||
|
stage.setY(bounds.y + bounds.height / 2 - stage.getHeight() / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static
|
||||||
|
void showOnSameScreenAsMouse(javafx.stage.Window stage) {
|
||||||
|
Point mouseLocation = MouseInfo.getPointerInfo()
|
||||||
|
.getLocation();
|
||||||
|
|
||||||
|
GraphicsDevice deviceAtMouse = ScreenUtil.getGraphicsDeviceAt(mouseLocation);
|
||||||
|
|
||||||
|
stage.setX(deviceAtMouse.getDefaultConfiguration()
|
||||||
|
.getBounds().x);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void runAndWait(Runnable runnable) {
|
||||||
|
// run synchronously on JavaFX thread
|
||||||
|
if (Platform.isFxApplicationThread()) {
|
||||||
|
runnable.run();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureTask future = new FutureTask(runnable, null);
|
||||||
|
Platform.runLater(future);
|
||||||
|
try {
|
||||||
|
future.get();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T runAndWait(Callable callable) {
|
||||||
|
// run synchronously on JavaFX thread
|
||||||
|
if (Platform.isFxApplicationThread()) {
|
||||||
|
try {
|
||||||
|
return (T) callable.call();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureTask future = new FutureTask(callable);
|
||||||
|
Platform.runLater(future);
|
||||||
|
try {
|
||||||
|
return (T) future.get();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void runLater(Runnable runnable) {
|
||||||
|
Platform.runLater(runnable);
|
||||||
|
}
|
||||||
|
}
|
79
Dorkbox-Util/src/dorkbox/util/ScreenUtil.java
Normal file
79
Dorkbox-Util/src/dorkbox/util/ScreenUtil.java
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
package dorkbox.util;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Screen utilities
|
||||||
|
*/
|
||||||
|
public final
|
||||||
|
class ScreenUtil {
|
||||||
|
public static
|
||||||
|
Rectangle getScreenBoundsAt(Point pos) {
|
||||||
|
GraphicsDevice gd = getGraphicsDeviceAt(pos);
|
||||||
|
Rectangle bounds = null;
|
||||||
|
|
||||||
|
if (gd != null) {
|
||||||
|
bounds = gd.getDefaultConfiguration()
|
||||||
|
.getBounds();
|
||||||
|
}
|
||||||
|
|
||||||
|
return bounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static
|
||||||
|
GraphicsDevice getGraphicsDeviceAt(Point pos) {
|
||||||
|
GraphicsDevice device;
|
||||||
|
|
||||||
|
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||||
|
GraphicsDevice lstGDs[] = ge.getScreenDevices();
|
||||||
|
|
||||||
|
ArrayList<GraphicsDevice> lstDevices = new ArrayList<GraphicsDevice>(lstGDs.length);
|
||||||
|
|
||||||
|
for (GraphicsDevice gd : lstGDs) {
|
||||||
|
|
||||||
|
GraphicsConfiguration gc = gd.getDefaultConfiguration();
|
||||||
|
Rectangle screenBounds = gc.getBounds();
|
||||||
|
|
||||||
|
if (screenBounds.contains(pos)) {
|
||||||
|
lstDevices.add(gd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lstDevices.size() > 0) {
|
||||||
|
device = lstDevices.get(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
device = ge.getDefaultScreenDevice();
|
||||||
|
}
|
||||||
|
|
||||||
|
return device;
|
||||||
|
}
|
||||||
|
|
||||||
|
private
|
||||||
|
ScreenUtil() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public static Rectangle getSafeScreenBounds(Point pos) {
|
||||||
|
// Rectangle bounds = getScreenBoundsAt(pos);
|
||||||
|
// Insets insets = getScreenInsetsAt(pos);
|
||||||
|
//
|
||||||
|
// bounds.x += insets.left;
|
||||||
|
// bounds.y += insets.top;
|
||||||
|
// bounds.width -= insets.left + insets.right;
|
||||||
|
// bounds.height -= insets.top + insets.bottom;
|
||||||
|
//
|
||||||
|
// return bounds;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public static Insets getScreenInsetsAt(Point pos) {
|
||||||
|
// GraphicsDevice gd = getGraphicsDeviceAt(pos);
|
||||||
|
// Insets insets = null;
|
||||||
|
// if (gd != null) {
|
||||||
|
// insets = Toolkit.getDefaultToolkit().getScreenInsets(gd.getDefaultConfiguration());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return insets;
|
||||||
|
// }
|
||||||
|
}
|
|
@ -18,7 +18,6 @@ package dorkbox.util;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
public
|
public
|
||||||
class SwingUtil {
|
class SwingUtil {
|
||||||
|
@ -27,7 +26,7 @@ class SwingUtil {
|
||||||
Point mouseLocation = MouseInfo.getPointerInfo()
|
Point mouseLocation = MouseInfo.getPointerInfo()
|
||||||
.getLocation();
|
.getLocation();
|
||||||
|
|
||||||
GraphicsDevice deviceAtMouse = getGraphicsDeviceAt(mouseLocation);
|
GraphicsDevice deviceAtMouse = ScreenUtil.getGraphicsDeviceAt(mouseLocation);
|
||||||
Rectangle bounds = deviceAtMouse.getDefaultConfiguration()
|
Rectangle bounds = deviceAtMouse.getDefaultConfiguration()
|
||||||
.getBounds();
|
.getBounds();
|
||||||
frame.setLocation(bounds.x + bounds.width / 2 - frame.getWidth() / 2, bounds.y + bounds.height / 2 - frame.getHeight() / 2);
|
frame.setLocation(bounds.x + bounds.width / 2 - frame.getWidth() / 2, bounds.y + bounds.height / 2 - frame.getHeight() / 2);
|
||||||
|
@ -38,75 +37,11 @@ class SwingUtil {
|
||||||
Point mouseLocation = MouseInfo.getPointerInfo()
|
Point mouseLocation = MouseInfo.getPointerInfo()
|
||||||
.getLocation();
|
.getLocation();
|
||||||
|
|
||||||
GraphicsDevice deviceAtMouse = getGraphicsDeviceAt(mouseLocation);
|
GraphicsDevice deviceAtMouse = ScreenUtil.getGraphicsDeviceAt(mouseLocation);
|
||||||
frame.setLocation(deviceAtMouse.getDefaultConfiguration()
|
frame.setLocation(deviceAtMouse.getDefaultConfiguration()
|
||||||
.getBounds().x, frame.getY());
|
.getBounds().x, frame.getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static
|
|
||||||
Rectangle getScreenBoundsAt(Point pos) {
|
|
||||||
GraphicsDevice gd = SwingUtil.getGraphicsDeviceAt(pos);
|
|
||||||
Rectangle bounds = null;
|
|
||||||
if (gd != null) {
|
|
||||||
bounds = gd.getDefaultConfiguration()
|
|
||||||
.getBounds();
|
|
||||||
}
|
|
||||||
|
|
||||||
return bounds;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static
|
|
||||||
GraphicsDevice getGraphicsDeviceAt(Point pos) {
|
|
||||||
GraphicsDevice device;
|
|
||||||
|
|
||||||
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
|
||||||
GraphicsDevice lstGDs[] = ge.getScreenDevices();
|
|
||||||
|
|
||||||
ArrayList<GraphicsDevice> lstDevices = new ArrayList<GraphicsDevice>(lstGDs.length);
|
|
||||||
|
|
||||||
for (GraphicsDevice gd : lstGDs) {
|
|
||||||
|
|
||||||
GraphicsConfiguration gc = gd.getDefaultConfiguration();
|
|
||||||
Rectangle screenBounds = gc.getBounds();
|
|
||||||
|
|
||||||
if (screenBounds.contains(pos)) {
|
|
||||||
lstDevices.add(gd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lstDevices.size() > 0) {
|
|
||||||
device = lstDevices.get(0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
device = ge.getDefaultScreenDevice();
|
|
||||||
}
|
|
||||||
|
|
||||||
return device;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// public static Rectangle getSafeScreenBounds(Point pos) {
|
|
||||||
// Rectangle bounds = getScreenBoundsAt(pos);
|
|
||||||
// Insets insets = getScreenInsetsAt(pos);
|
|
||||||
//
|
|
||||||
// bounds.x += insets.left;
|
|
||||||
// bounds.y += insets.top;
|
|
||||||
// bounds.width -= insets.left + insets.right;
|
|
||||||
// bounds.height -= insets.top + insets.bottom;
|
|
||||||
//
|
|
||||||
// return bounds;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public static Insets getScreenInsetsAt(Point pos) {
|
|
||||||
// GraphicsDevice gd = getGraphicsDeviceAt(pos);
|
|
||||||
// Insets insets = null;
|
|
||||||
// if (gd != null) {
|
|
||||||
// insets = Toolkit.getDefaultToolkit().getScreenInsets(gd.getDefaultConfiguration());
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return insets;
|
|
||||||
// }
|
|
||||||
|
|
||||||
public static
|
public static
|
||||||
void invokeLater(Runnable runnable) {
|
void invokeLater(Runnable runnable) {
|
||||||
if (EventQueue.isDispatchThread()) {
|
if (EventQueue.isDispatchThread()) {
|
||||||
|
|
|
@ -30,10 +30,16 @@
|
||||||
package dorkbox.util.javafx;
|
package dorkbox.util.javafx;
|
||||||
|
|
||||||
import dorkbox.util.JavaFxUtil;
|
import dorkbox.util.JavaFxUtil;
|
||||||
|
import dorkbox.util.ScreenUtil;
|
||||||
import impl.org.controlsfx.ImplUtils;
|
import impl.org.controlsfx.ImplUtils;
|
||||||
import javafx.application.Platform;
|
import javafx.animation.Interpolator;
|
||||||
|
import javafx.animation.KeyFrame;
|
||||||
|
import javafx.animation.KeyValue;
|
||||||
|
import javafx.animation.Timeline;
|
||||||
import javafx.beans.property.*;
|
import javafx.beans.property.*;
|
||||||
|
import javafx.beans.value.ChangeListener;
|
||||||
import javafx.beans.value.ObservableValue;
|
import javafx.beans.value.ObservableValue;
|
||||||
|
import javafx.beans.value.WritableValue;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import javafx.collections.ObservableMap;
|
import javafx.collections.ObservableMap;
|
||||||
|
@ -46,19 +52,25 @@ import javafx.scene.Scene;
|
||||||
import javafx.scene.control.Button;
|
import javafx.scene.control.Button;
|
||||||
import javafx.scene.control.Dialog;
|
import javafx.scene.control.Dialog;
|
||||||
import javafx.scene.control.ToolBar;
|
import javafx.scene.control.ToolBar;
|
||||||
|
import javafx.scene.image.Image;
|
||||||
import javafx.scene.input.KeyCode;
|
import javafx.scene.input.KeyCode;
|
||||||
import javafx.scene.input.KeyEvent;
|
import javafx.scene.input.KeyEvent;
|
||||||
|
import javafx.scene.input.MouseEvent;
|
||||||
import javafx.scene.layout.*;
|
import javafx.scene.layout.*;
|
||||||
import javafx.scene.text.Font;
|
import javafx.scene.text.Font;
|
||||||
import javafx.scene.text.Text;
|
import javafx.scene.text.Text;
|
||||||
|
import javafx.stage.Modality;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import javafx.stage.StageStyle;
|
import javafx.stage.StageStyle;
|
||||||
import javafx.stage.Window;
|
import javafx.stage.Window;
|
||||||
|
import javafx.util.Duration;
|
||||||
import org.controlsfx.control.PopOver;
|
import org.controlsfx.control.PopOver;
|
||||||
import org.controlsfx.tools.ValueExtractor;
|
import org.controlsfx.tools.ValueExtractor;
|
||||||
import org.controlsfx.validation.ValidationSupport;
|
import org.controlsfx.validation.ValidationSupport;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.List;
|
||||||
import java.util.function.BooleanSupplier;
|
import java.util.function.BooleanSupplier;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
@ -118,8 +130,9 @@ import java.util.function.Consumer;
|
||||||
* }
|
* }
|
||||||
* };}</pre>
|
* };}</pre>
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public class Wizard {
|
public class Wizard {
|
||||||
final Stage stage = new Stage(StageStyle.UTILITY);
|
final Stage stage = new Stage(StageStyle.UNDECORATED);
|
||||||
private final Text headerText;
|
private final Text headerText;
|
||||||
private final VBox center;
|
private final VBox center;
|
||||||
|
|
||||||
|
@ -174,7 +187,17 @@ public class Wizard {
|
||||||
private final Font defaultHeaderFont;
|
private final Font defaultHeaderFont;
|
||||||
private VBox graphicRegion;
|
private VBox graphicRegion;
|
||||||
|
|
||||||
|
WritableValue<Double> writableHeight = new WritableValue<Double>() {
|
||||||
|
@Override
|
||||||
|
public Double getValue() {
|
||||||
|
return stage.getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setValue(Double value) {
|
||||||
|
stage.setHeight(value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
*
|
*
|
||||||
|
@ -209,6 +232,11 @@ public class Wizard {
|
||||||
*/
|
*/
|
||||||
public
|
public
|
||||||
Wizard(Object owner, String title) {
|
Wizard(Object owner, String title) {
|
||||||
|
stage.initModality(Modality.APPLICATION_MODAL);
|
||||||
|
stage.titleProperty()
|
||||||
|
.bind(this.titleProperty);
|
||||||
|
setTitle(title);
|
||||||
|
|
||||||
BUTTON_PREVIOUS.setDisable(true);
|
BUTTON_PREVIOUS.setDisable(true);
|
||||||
BUTTON_NEXT.setDisable(true);
|
BUTTON_NEXT.setDisable(true);
|
||||||
|
|
||||||
|
@ -229,9 +257,6 @@ public class Wizard {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
stage.titleProperty()
|
|
||||||
.bind(this.titleProperty);
|
|
||||||
setTitle(title);
|
|
||||||
|
|
||||||
popOver = new PopOver();
|
popOver = new PopOver();
|
||||||
popOver.setDetachable(false);
|
popOver.setDetachable(false);
|
||||||
|
@ -264,7 +289,7 @@ public class Wizard {
|
||||||
public
|
public
|
||||||
void accept(final WizardPage currentPage) {
|
void accept(final WizardPage currentPage) {
|
||||||
if (currentPage.autoFocusNext) {
|
if (currentPage.autoFocusNext) {
|
||||||
Platform.runLater(BUTTON_NEXT::requestFocus);
|
JavaFxUtil.runLater(BUTTON_NEXT::requestFocus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -285,7 +310,6 @@ public class Wizard {
|
||||||
|
|
||||||
Button cancel = new Button("Cancel");
|
Button cancel = new Button("Cancel");
|
||||||
cancel.addEventFilter(ActionEvent.ACTION, event -> {
|
cancel.addEventFilter(ActionEvent.ACTION, event -> {
|
||||||
event.consume();
|
|
||||||
success = false;
|
success = false;
|
||||||
stage.close();
|
stage.close();
|
||||||
});
|
});
|
||||||
|
@ -314,13 +338,25 @@ public class Wizard {
|
||||||
// center.setStyle("-fx-background-color: #2046ff;");
|
// center.setStyle("-fx-background-color: #2046ff;");
|
||||||
borderPane.setCenter(center);
|
borderPane.setCenter(center);
|
||||||
|
|
||||||
Scene scene2 = new Scene(borderPane);
|
|
||||||
stage.setScene(scene2);
|
Scene scene = new Scene(borderPane);
|
||||||
|
stage.setScene(scene);
|
||||||
stage.setMinWidth(300);
|
stage.setMinWidth(300);
|
||||||
stage.setMinHeight(140);
|
stage.setMinHeight(140);
|
||||||
stage.setWidth(300);
|
stage.setWidth(300);
|
||||||
stage.setHeight(140);
|
stage.setHeight(140);
|
||||||
|
|
||||||
|
|
||||||
|
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
|
||||||
|
public void handle(KeyEvent ke) {
|
||||||
|
if (ke.getCode() == KeyCode.ESCAPE) {
|
||||||
|
success = false;
|
||||||
|
stage.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
Window window = null;
|
Window window = null;
|
||||||
if (owner instanceof Window) {
|
if (owner instanceof Window) {
|
||||||
window = (Window) owner;
|
window = (Window) owner;
|
||||||
|
@ -331,24 +367,115 @@ public class Wizard {
|
||||||
}
|
}
|
||||||
|
|
||||||
stage.initOwner(window);
|
stage.initOwner(window);
|
||||||
|
|
||||||
|
stage.setResizable(false); // hide the minimize/maximize decorations
|
||||||
|
stage.showingProperty().addListener(new ChangeListener<Boolean>() {
|
||||||
|
@Override
|
||||||
|
public
|
||||||
|
void changed(final ObservableValue<? extends Boolean> observable, final Boolean oldValue, final Boolean newValue) {
|
||||||
|
if (newValue) {
|
||||||
|
JavaFxUtil.runLater(() -> {
|
||||||
|
// If this runs now, it will bug out, and flash on the screen before we want it to.
|
||||||
|
// REALLY dumb, but we have to wait for the system to draw the window and finish BEFORE we move it
|
||||||
|
// otherwise, it'll 'flash' onscreen because it will still be in the middle of it's initial "on-show" fade-in.
|
||||||
|
try {
|
||||||
|
Thread.sleep(2000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
Point mouseLocation = MouseInfo.getPointerInfo()
|
||||||
|
.getLocation();
|
||||||
|
|
||||||
|
final GraphicsDevice deviceAtMouse = ScreenUtil.getGraphicsDeviceAt(mouseLocation);
|
||||||
|
final Rectangle bounds = deviceAtMouse.getDefaultConfiguration()
|
||||||
|
.getBounds();
|
||||||
|
|
||||||
|
final double stageX = bounds.x + bounds.width / 2 - stage.getWidth() / 2;
|
||||||
|
final double stageY = bounds.y + bounds.height / 2 - stage.getHeight() / 2;
|
||||||
|
|
||||||
|
stage.setX(stageX);
|
||||||
|
stage.setY(stageY);
|
||||||
|
|
||||||
|
|
||||||
|
Timeline timeline = new Timeline();
|
||||||
|
timeline.setCycleCount(1);
|
||||||
|
timeline.getKeyFrames()
|
||||||
|
.addAll(new KeyFrame(Duration.millis(700),
|
||||||
|
new KeyValue(stage.opacityProperty(), 1, Interpolator.EASE_OUT)));
|
||||||
|
|
||||||
|
|
||||||
|
timeline.setOnFinished(event -> {
|
||||||
|
final double verifyStageX = bounds.x + bounds.width / 2 - stage.getWidth() / 2;
|
||||||
|
final double verifyStageY = bounds.y + bounds.height / 2 - stage.getHeight() / 2;
|
||||||
|
|
||||||
|
if (stageX != verifyStageX || stageY != verifyStageY) {
|
||||||
|
// whoops. we should move the stage to the correct location.
|
||||||
|
|
||||||
|
final DoubleProperty xProp = new SimpleDoubleProperty();
|
||||||
|
xProp.addListener((observable1, oldValue1, newValue1) -> {
|
||||||
|
stage.setX((Double) newValue1);
|
||||||
|
});
|
||||||
|
|
||||||
|
final DoubleProperty yProp = new SimpleDoubleProperty();
|
||||||
|
yProp.addListener((observable1, oldValue1, newValue1) -> {
|
||||||
|
stage.setY((Double) newValue1);
|
||||||
|
});
|
||||||
|
|
||||||
|
Timeline timelineMove = new Timeline();
|
||||||
|
timelineMove.getKeyFrames()
|
||||||
|
.addAll(new KeyFrame(Duration.ZERO,
|
||||||
|
new KeyValue(xProp, stageX),
|
||||||
|
new KeyValue(yProp, stageY)),
|
||||||
|
new KeyFrame(Duration.millis(300),
|
||||||
|
new KeyValue(xProp, verifyStageX, Interpolator.EASE_OUT),
|
||||||
|
new KeyValue(yProp, verifyStageY, Interpolator.EASE_OUT)));
|
||||||
|
|
||||||
|
timelineMove.play();
|
||||||
|
}
|
||||||
|
|
||||||
|
// when the mouse enters or leaves, we want to fade in/out the application
|
||||||
|
Timeline timelineVis = new Timeline();
|
||||||
|
scene.addEventHandler(MouseEvent.MOUSE_ENTERED, event1 -> {
|
||||||
|
timelineVis.stop();
|
||||||
|
timelineVis.getKeyFrames().clear();
|
||||||
|
timelineVis.getKeyFrames()
|
||||||
|
.addAll(new KeyFrame(Duration.millis(700),
|
||||||
|
new KeyValue(stage.opacityProperty(), 1, Interpolator.EASE_OUT)));
|
||||||
|
timelineVis.play();
|
||||||
|
});
|
||||||
|
|
||||||
|
scene.addEventHandler(MouseEvent.MOUSE_EXITED, event1 -> {
|
||||||
|
timelineVis.stop();
|
||||||
|
timelineVis.getKeyFrames().clear();
|
||||||
|
timelineVis.getKeyFrames()
|
||||||
|
.addAll(new KeyFrame(Duration.millis(700),
|
||||||
|
new KeyValue(stage.opacityProperty(), .7, Interpolator.EASE_OUT)));
|
||||||
|
timelineVis.play();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
timeline.play();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private
|
private
|
||||||
void validatePopover(final String newValue) {
|
void validatePopover(final String newValue) {
|
||||||
if (newValue != null) {
|
if (newValue != null) {
|
||||||
currentPage.ifPresent(currentPage -> {
|
currentPage.ifPresent(currentPage -> JavaFxUtil.runLater(() -> {
|
||||||
Platform.runLater(() -> {
|
final PopOver popOver = this.popOver;
|
||||||
final PopOver popOver = this.popOver;
|
|
||||||
|
|
||||||
this.popOverErrorText.setText(newValue);
|
this.popOverErrorText.setText(newValue);
|
||||||
|
|
||||||
if (!popOver.isShowing()) {
|
if (!popOver.isShowing()) {
|
||||||
popOver.setX(0);
|
popOver.setX(0);
|
||||||
popOver.setY(0);
|
popOver.setY(0);
|
||||||
popOver.show(BUTTON_NEXT, -10);
|
popOver.show(BUTTON_NEXT, -10);
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
popOver.hide();
|
popOver.hide();
|
||||||
}
|
}
|
||||||
|
@ -377,8 +504,7 @@ public class Wizard {
|
||||||
*/
|
*/
|
||||||
public final
|
public final
|
||||||
void show() {
|
void show() {
|
||||||
JavaFxUtil.showOnSameScreenAsMouseCenter(stage);
|
// stage.show();
|
||||||
stage.show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -389,7 +515,9 @@ public class Wizard {
|
||||||
*/
|
*/
|
||||||
public final
|
public final
|
||||||
boolean showAndWait() {
|
boolean showAndWait() {
|
||||||
JavaFxUtil.showOnSameScreenAsMouseCenter(stage);
|
stage.setOpacity(0.0);
|
||||||
|
stage.setX(10000);
|
||||||
|
stage.setY(10000);
|
||||||
stage.showAndWait();
|
stage.showAndWait();
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
|
@ -692,21 +820,21 @@ public class Wizard {
|
||||||
|
|
||||||
final Node firstFocusElement = currentPage.firstFocusElement;
|
final Node firstFocusElement = currentPage.firstFocusElement;
|
||||||
if (firstFocusElement != null) {
|
if (firstFocusElement != null) {
|
||||||
Platform.runLater(() -> {
|
JavaFxUtil.runLater(() -> {
|
||||||
if (isInvalid()) {
|
if (isInvalid()) {
|
||||||
firstFocusElement.requestFocus();
|
firstFocusElement.requestFocus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Platform.runLater(BUTTON_NEXT::requestFocus);
|
JavaFxUtil.runLater(BUTTON_NEXT::requestFocus);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (isInvalid()) {
|
if (isInvalid()) {
|
||||||
Platform.runLater(BUTTON_PREVIOUS::requestFocus);
|
JavaFxUtil.runLater(BUTTON_PREVIOUS::requestFocus);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Platform.runLater(BUTTON_NEXT::requestFocus);
|
JavaFxUtil.runLater(BUTTON_NEXT::requestFocus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -735,7 +863,7 @@ public class Wizard {
|
||||||
stage.sizeToScene();
|
stage.sizeToScene();
|
||||||
}
|
}
|
||||||
|
|
||||||
Platform.runLater(() -> {
|
JavaFxUtil.runLater(() -> {
|
||||||
if (isInvalid()) {
|
if (isInvalid()) {
|
||||||
validatePopover(currentPage.invalidPropertyStrings.get());
|
validatePopover(currentPage.invalidPropertyStrings.get());
|
||||||
} else {
|
} else {
|
||||||
|
@ -863,6 +991,17 @@ public class Wizard {
|
||||||
BUTTON_PREVIOUS.requestFocus();
|
BUTTON_PREVIOUS.requestFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// You can add multiple images of different sizes and JavaFX will pick the one that fits best. Because you have different sizes in task bar and different in title bar.
|
||||||
|
public
|
||||||
|
void setApplicationIcon(final Image applicationIcon) {
|
||||||
|
final ObservableList<Image> icons = stage.getIcons();
|
||||||
|
icons.clear();
|
||||||
|
icons.add(applicationIcon);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
*
|
*
|
||||||
* Support classes
|
* Support classes
|
||||||
|
|
|
@ -139,20 +139,6 @@ class WizardPage {
|
||||||
|
|
||||||
public
|
public
|
||||||
void registerValidator(final Control control, final Validator<Object> validator) {
|
void registerValidator(final Control control, final Validator<Object> validator) {
|
||||||
Platform.runLater(() -> {
|
|
||||||
validator.apply(control, null);
|
|
||||||
// Optional<ValidationDecoration> odecorator = Optional.ofNullable(validationSupport.getValidationDecorator());
|
|
||||||
// for (Control target : validationSupport.getRegisteredControls()) {
|
|
||||||
// odecorator.ifPresent(decorator -> {
|
|
||||||
// decorator.removeDecorations(target);
|
|
||||||
// decorator.applyRequiredDecoration(target);
|
|
||||||
// validationResults.get(target);
|
|
||||||
// Optional<ValidationMessage> highestMessage = validationSupport.getHighestMessage(target);
|
|
||||||
// highestMessage.ifPresent(msg -> decorator.applyValidationDecoration(msg));
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
});
|
|
||||||
|
|
||||||
this.validationSupport.registerValidator(control, validator);
|
this.validationSupport.registerValidator(control, validator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user