JavaFX 文本字段事件处理程序

标签 java javafx

目前我有一个 TextField 是我的地址栏,一个 WebView 是我的页面。当我点击输入时,TextField 似乎没有做任何事情。它意味着运行 loadPage 方法并设置页面以加载用户在地址栏中输入的任何内容。任何帮助将不胜感激。

package javafx_webview;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class Main extends Application {

    WebEngine myWebEngine;

    public static void main(String[] args) {
        launch(args);
    }

    public void start(Stage primaryStage) {
        primaryStage.setTitle("Platinum v1");

        TextField addressBar = new TextField();

        addressBar.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                loadPage(event.toString());
            }
        });

        WebView myBrowser = new WebView();
        myWebEngine = myBrowser.getEngine();

        StackPane root = new StackPane();
        root.getChildren().add(myBrowser);
        root.getChildren().add(addressBar);
        primaryStage.setScene(new Scene(root, 640, 480));
        primaryStage.show();
    }

    private void loadPage(String url) {
        try {
            myWebEngine.load(url);
        } catch (Exception e) {
            System.out.println("The URL you requested could not be found.");
        }
    }
}

最佳答案

从地址栏的text获取要加载的url,而不是地址栏上的action事件的toString

final TextField addressBar = new TextField();
addressBar.setOnAction(new EventHandler<ActionEvent>() {
  public void handle(ActionEvent event) {
    myWebEngine.load(addressBar.getText());
  }
});

此外,加载是异步的,因此您的异常处理程序将不起作用。您需要监控 webengine loadworker 的异常属性以从引擎获取异常。另请注意,未找到 url 不一定是会报告的异常,相反,网络服务器通常会返回一个 http 404 错误页面。

这是一个工作示例:

import javafx.application.Application;
import javafx.beans.value.*;
import javafx.event.*;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.web.*;
import javafx.stage.Stage;

public class Main extends Application {
  private WebEngine myWebEngine;

  public void start(Stage stage) {
    stage.setTitle("Platinum v1");

    final TextField addressBar = new TextField();

    addressBar.setOnAction(new EventHandler<ActionEvent>() {
      public void handle(ActionEvent event) {
        myWebEngine.load(addressBar.getText());
      }
    });

    WebView myBrowser = new WebView();
    myWebEngine = myBrowser.getEngine();
    myWebEngine.getLoadWorker().exceptionProperty().addListener(new ChangeListener<Throwable>() {
      @Override public void changed(ObservableValue<? extends Throwable> observableValue, Throwable oldException, Throwable exception) {
        System.out.println("WebView encountered an exception loading a page: " + exception);
      }
    });

    VBox root = new VBox();
    root.getChildren().setAll(
        addressBar,
        myBrowser
    );
    stage.setScene(new Scene(root));
    stage.show();
  }

  public static void main(String[] args) { launch(args); }
}

关于JavaFX 文本字段事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16370688/

相关文章:

java - 无法在 libgdx 中隐藏碰撞图像?

java - 哪个 Swing 布局管理器可以获得我想要的布局?

java - 限制按键输入以防止垃圾邮件

java - 如何使用反射调用java中的方法

java - ProGuard 和 HoloEverywhere : Export Signed Application Errors

java - 使用 JavaFx 监听系统剪贴板

java - 如何将 javafx.scene.paint.Color 转换为 java.awt.Color ?

java - 如何在 Java 中将文本打印到文本区域而不是文本区域下方

java - 动画从一个点到另一个点绘制的线

java - 使用 JDK 1.7 运行 Play 应用程序时出现 UnsupportedClassVersionError