package org.codefx.libfx.control.webview;
import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkEvent.EventType;
import org.codefx.libfx.listener.handle.ListenerHandle;
/**
* Demonstrates how to use the {@link WebViewHyperlinkListener}.
*/
public class WebViewHyperlinkListenerDemo extends Application {
// #begin INITIALIZATION
/**
* Runs this demo.
*
* @param args
* command line arguments (will not be used)
*/
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
// controls
WebView webView = createWebView();
Label urlLabel = createUrlLabel();
CheckBox listenerAttachedBox = createListenerAttachedBox();
CheckBox cancelEventBox = createCancelEventBox();
// listener
WebViewHyperlinkListener listener = event -> {
showEventOnLabel(event, urlLabel);
return cancelEventBox.isSelected();
};
manageListener(webView, listener, listenerAttachedBox.selectedProperty());
// put together
VBox box = new VBox(webView, listenerAttachedBox, cancelEventBox, urlLabel);
Scene scene = new Scene(box);
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* Creates the web view to which the listener will be attached.
*
* @return a {@link WebView}
*/
private static WebView createWebView() {
WebView webView = new WebView();
webView.getEngine().getLoadWorker().stateProperty().addListener(
(obs, o, n) -> System.out.println("WEB VIEW WORKER STATUS: " + n));
webView.getEngine().load("https://en.wikipedia.org/wiki/Main_Page");
return webView;
}
/**
* Creates the Label which will display the URL.
*
* @return a {@link Label}
*/
private static Label createUrlLabel() {
return new Label();
}
/**
* Creates the check box with which the listener can be attached and detached.
*
* @return a {@link CheckBox}
*/
private static CheckBox createListenerAttachedBox() {
return new CheckBox("hyperlink listener attached");
}
/**
* Creates the check box with which the further processing of events can be cancelled.
*
* @return a {@link CheckBox}
*/
private static CheckBox createCancelEventBox() {
return new CheckBox("cancel event processing");
}
// #end INITIALIZATION
// #begin LISTENER
/**
* Attaches/detaches the specified listener to/from the specified web view according to the specified property's
* value.
*
* @param webView
* the {@link WebView} to which the listener will be added
* @param listener
* the added listener
* @param attachedProperty
* defines whether the listener is attached or not
*/
private static void manageListener(WebView webView, WebViewHyperlinkListener listener,
BooleanProperty attachedProperty) {
attachedProperty.set(true);
ListenerHandle listenerHandle = WebViews.addHyperlinkListener(webView, listener);
attachedProperty.addListener((obs, wasAttached, isAttached) -> {
if (isAttached) {
listenerHandle.attach();
System.out.println("LISTENER: attached.");
} else {
listenerHandle.detach();
System.out.println("LISTENER: detached.");
}
});
}
/**
* Visualizes the specified event's type and URL on the specified label.
*
* @param event
* the {@link HyperlinkEvent} to visualize
* @param urlLabel
* the {@link Label} which will visualize the event
*/
private static void showEventOnLabel(HyperlinkEvent event, Label urlLabel) {
if (event.getEventType() == EventType.ENTERED) {
urlLabel.setTextFill(Color.BLACK);
urlLabel.setText("ENTERED: " + event.getURL().toExternalForm());
System.out.println("EVENT: " + WebViews.hyperlinkEventToString(event));
} else if (event.getEventType() == EventType.EXITED) {
urlLabel.setTextFill(Color.BLACK);
urlLabel.setText("EXITED: " + event.getURL().toExternalForm());
System.out.println("EVENT: " + WebViews.hyperlinkEventToString(event));
} else if (event.getEventType() == EventType.ACTIVATED) {
urlLabel.setText("ACTIVATED: " + event.getURL().toExternalForm());
urlLabel.setTextFill(Color.RED);
System.out.println("EVENT: " + WebViews.hyperlinkEventToString(event));
}
}
// #end LISTENER
}