私は Java と JavaFX の初心者です。matched
Web エンジンを実装する( Browser
) クラスから Application ( ) クラスに変数を渡す方法がわかりませんMyScene
。両方のクラスを以下に示します。変数が更新された後、ページが読み込まれた後に実行する必要があることは理解しています (私は正しいですか?)。私はそれを行うには2つの方法があると思います.クラスを強制的に数秒間待機させてから、((リストされていない)クラスのように)MyScene
メソッドで取得するか、変数が更新されたことをクラスに通知します.しかし、私はしませんどなたか提案はありますか?public String getMatched()
Browser
MyScene
MyScene.java :
package mypackage;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.concurrent.Task;
public class MyScene extends Application {
private Scene scene;
private static String address = "https://www.google.com";
@Override public void start(Stage stage) {
// create the scene
stage.setTitle("Web View");
Browser myBrowser = new Browser(address);
scene = new Scene(myBrowser,750,500);
stage.setResizable(false);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args){
launch();
}
}
Browser.java :
package mypackage;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker.State;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
class Browser extends Region {
private String matched;
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
public Browser(String loadAddress) {
String myAddress = loadAddress;
//apply the styles
getStyleClass().add("browser");
// load the web page
webEngine.load(myAddress);
//add the web view to the scene
getChildren().add(browser);
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>() {
public void changed(ObservableValue ov, State oldState, State newState) {
if (newState == State.SUCCEEDED) {
Pattern fbPattern = Pattern.compile(" <title id=\"([...]+)\">");
NodeList lst = webEngine.getDocument().getElementsByTagName("script");
if (lst != null && lst.getLength() > 0) {
for (int i = 0; i < lst.getLength(); i++) {
if (lst.item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
Element el = (Element) lst.item(i);
Matcher fbMatcher = fbPattern.matcher(el.getTextContent());
if (fbMatcher.find()) {
matched = fbMatcher.group(1);
}
}
}
}
}
}
});
}
private Node createSpacer() {
Region spacer = new Region();
HBox.setHgrow(spacer, Priority.ALWAYS);
return spacer;
}
@Override protected void layoutChildren() {
double w = getWidth();
double h = getHeight();
layoutInArea(browser,0,0,w,h,0, HPos.CENTER, VPos.CENTER);
}
@Override protected double computePrefWidth(double height) {
return 750;
}
@Override protected double computePrefHeight(double width) {
return 500;
}
}