JavaFX WebView로 웹 콘텐츠 표시하기
JavaFX WebView로 웹 콘텐츠 표시하기
JavaFX의 WebView 컴포넌트를 사용하면 Java 애플리케이션 내에서 웹 콘텐츠를 표시하고 JavaScript와 상호작용할 수 있습니다.
기본 사용법
WebView와 WebEngine 생성
// WebView 생성
WebView browser = new WebView();
// WebEngine 가져오기
WebEngine webEngine = browser.getEngine();
콘텐츠 로드 방법
1. Remote URL 로드
webEngine.load("http://eclipse.com");
2. HTML 문자열 로드
String html = "<html><h1>Hello</h1><h2>Hello</h2></html>";
// 방법 1
webEngine.loadContent(html);
// 방법 2 - MIME 타입 지정
webEngine.loadContent(html, "text/html");
3. 로컬 파일 로드
File file = new File("C:/test/a.html");
URL url = file.toURI().toURL();
// file:/C:/test/a.html
webEngine.load(url.toString());
JavaScript 실행
단순 실행
webEngine.executeScript("history.back()");
JSObject를 통한 실행
// JavaScript 객체 가져오기
JSObject history = (JSObject) webEngine.executeScript("history");
// 파라미터 없이 메서드 호출
history.call("back");
DOM 조작
Element p = (Element) webEngine.executeScript("document.getElementById('para')");
p.setAttribute("style", "font-weight: bold");
Java와 JavaScript 양방향 통신
JavaScript에서 Java 호출
Java 객체를 JavaScript의 window 객체에 노출시킬 수 있습니다.
public class Bridge {
public void showTime() {
System.out.println("Show Time");
label.setText("Now is: " + df.format(new Date()));
}
}
// window 객체 가져오기
JSObject jsobj = (JSObject) webEngine.executeScript("window");
// Java 객체를 window의 멤버로 설정
jsobj.setMember("myJavaMember", new Bridge());
JavaScript에서 호출:
// HTML 또는 JavaScript에서
myJavaMember.showTime();
전체 예제
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;
public class WebViewExample extends Application {
@Override
public void start(Stage primaryStage) {
WebView browser = new WebView();
WebEngine webEngine = browser.getEngine();
// 웹 페이지 로드
webEngine.load("https://example.com");
// 페이지 로드 완료 후 JavaScript 실행
webEngine.getLoadWorker().stateProperty().addListener(
(observable, oldValue, newValue) -> {
if (newValue == Worker.State.SUCCEEDED) {
// JavaScript와 Java 브릿지 설정
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("javaBridge", new JavaBridge());
}
}
);
VBox root = new VBox(browser);
Scene scene = new Scene(root, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public class JavaBridge {
public void log(String message) {
System.out.println("JS: " + message);
}
}
public static void main(String[] args) {
launch(args);
}
}
주의사항
- WebView는 JavaFX 스레드에서만 조작해야 합니다.
- JavaScript 브릿지 객체는 강한 참조를 유지해야 GC에 의해 수거되지 않습니다.
- 보안상 신뢰할 수 없는 콘텐츠 로드 시 주의가 필요합니다.
참고
WebView는 내부적으로 WebKit 엔진을 사용합니다. 따라서 최신 웹 표준 일부는 지원되지 않을 수 있습니다.
Comments