【问题标题】:How to view a web page with FX:ID JavaFx如何使用 FX:ID JavaFx 查看网页
【发布时间】:2016-10-11 23:15:45
【问题描述】:

我想知道我构建了一个 GUI java Scene Builder 但我希望它在我拥有的 VBOX 中显示一个网站。毫无疑问,这运行得很好。但是有一些问题是它不会在我制作的 FX:ID VBOX 中显示网站。我只是以谷歌为例。我正在为我制作的游戏构建游戏启动器,但我不喜欢 Swing 或 AWT 的外观,所以我切换到了 JavaFx。我现在有点如何使用它,但我可以弄清楚如何将我的 VBOX 与我的代码连接起来。感谢您的帮助。这是我目前的代码

import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class Main extends Application {

    @FXML public VBox VBOX;

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent main = FXMLLoader.load(getClass().getResource("launcher.fxml"));

        primaryStage.setTitle("Dev Launcher");
        primaryStage.setWidth(900);
        primaryStage.setHeight(560);

        Scene scene = new Scene(new Group());
        VBOX = new VBox();
        final WebView browser = new WebView();
        final WebEngine webEngine = browser.getEngine();
        webEngine.load("http://google.com");

        VBOX.getChildren().addAll(browser);
        scene.setRoot(main);

        primaryStage.setScene(scene);
        primaryStage.setResizable(false);
        primaryStage.show();
    }

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

这是 FXML 文件

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.*?>
<?import javafx.scene.effect.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.web.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefWidth="900.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <bottom>
      <ToolBar prefHeight="40.0" prefWidth="200.0" BorderPane.alignment="CENTER">
        <items>
            <GridPane alignment="CENTER" prefHeight="57.0" prefWidth="883.0">
              <columnConstraints>
                <ColumnConstraints hgrow="SOMETIMES" maxWidth="375.2518005371094" minWidth="10.0" prefWidth="154.2821502685547" />
                <ColumnConstraints halignment="CENTER" hgrow="ALWAYS" maxWidth="550.5108489990234" minWidth="0.0" prefWidth="481.0280303955078" />
                  <ColumnConstraints hgrow="SOMETIMES" maxWidth="173.30714416503906" minWidth="10.0" prefWidth="154.2821502685547" />
              </columnConstraints>
              <rowConstraints>
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
              </rowConstraints>
               <children>
                  <Button mnemonicParsing="false" prefHeight="57.0" prefWidth="286.0" text="Play" GridPane.columnIndex="1" GridPane.halignment="CENTER">
                     <font>
                        <Font name="System Bold" size="13.0" />
                     </font>
                  </Button>
                  <Button mnemonicParsing="false" prefHeight="30.0" prefWidth="85.0" text="Website" GridPane.halignment="RIGHT" GridPane.valignment="CENTER" />
                <Button mnemonicParsing="false" prefHeight="30.0" prefWidth="85.0" text="About" GridPane.valignment="CENTER" />
                  <Label text="Version: " GridPane.columnIndex="2" GridPane.halignment="LEFT" GridPane.hgrow="SOMETIMES" GridPane.valignment="CENTER" GridPane.vgrow="SOMETIMES" />
                  <Label prefWidth="120.0" text="0.0.1" GridPane.columnIndex="2" GridPane.halignment="RIGHT" GridPane.valignment="CENTER" GridPane.vgrow="SOMETIMES">
                     <GridPane.margin>
                        <Insets left="-100.0" />
                     </GridPane.margin>
                  </Label>
               </children>
            </GridPane>
        </items>
      </ToolBar>
   </bottom>
   <center>
      <TabPane nodeOrientation="LEFT_TO_RIGHT" prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" BorderPane.alignment="CENTER">
        <tabs>
          <Tab text="Update Notes">
            <content>
              <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
                     <children>
                        <ScrollPane layoutX="1.0" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">
                           <content>
                              <AnchorPane prefHeight="450.0" prefWidth="862.0">
                                 <children>
                                    <VBox fx:id="VBOX" alignment="CENTER" prefHeight="200.0" prefWidth="100.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
                                 </children>
                              </AnchorPane>
                           </content>
                        </ScrollPane>
                     </children>
                  </AnchorPane>
            </content>
          </Tab>
          <Tab text="Game Log">
            <content>
              <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
            </content>
          </Tab>
        </tabs>
      </TabPane>
   </center>
</BorderPane>

我没有太多的Controller类:

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;

import java.io.IOException;

public class Controller {

    @FXML private VBox VBOX;

}

【问题讨论】:

  • 请编辑您的问题以提供您的 FXML 文件和控制器代码。另见:JavaFX controller class not working
  • @jewelsea 好的,我添加了它
  • 我添加了到目前为止我所拥有的东西我很抱歉我对这一切都不熟悉。 @jewelsea

标签: java user-interface javafx webview


【解决方案1】:

您的应用程序需要做的就是维护应用程序的生命周期(例如启动应用程序、执行 start 方法将初始场景加载到舞台、显示舞台并根据需要停止应用程序)。这对它来说已经足够了,其他逻辑可以委托给程序中的其他类(例如控制器)。控制器是 FXMLLoader 创建的东西,并且 FXMLLoader 足够智能,可以为场景图创建底层节点并将它们自动连接到控制器,这一事实使这种委托变得容易。

因此,您不需要(也不应该)将标记为 @FXML 的对象设置为新值。 例如,声明:@FXML public VBox VBOX;,然后调用:VBOX = new VBox(); 是错误的。

你也不应该在你的应用程序中设置 @FXML 字段,因为这没有意义。 @FXML 仅在控制器中才有意义。该应用程序通常不是(也不应该是)控制器。如果是这样,它会导致问题,因为通常,当您加载新的 FXML 时,FXMLLoader 会创建一个新的控制器。在您的应用程序中拥有多个应用程序实例是没有意义的,一个由 java 启动器创建,另一个由 FXMLLoader 创建(它只会让您非常困惑)。有关这方面的更多信息,请参阅JavaFX controller class not working

记住这一点,您的代码可以重构如下。

sample.Main

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.*;
import javafx.stage.Stage;

public class Main extends Application {    
    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent main = FXMLLoader.load(getClass().getResource("launcher.fxml"));

        primaryStage.setTitle("Dev Launcher");
        primaryStage.setWidth(900);
        primaryStage.setHeight(560);

        Scene scene = new Scene(main);

        primaryStage.setScene(scene);
        primaryStage.setResizable(false);
        primaryStage.show();
    }

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

sample.Controller

package sample;

import javafx.fxml.FXML;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;

public class Controller {
    @FXML private VBox vbox;

    public void initialize() {
        final WebView browser = new WebView();
        final WebEngine webEngine = browser.getEngine();
        webEngine.load("http://google.com");

        vbox.getChildren().addAll(browser);
    }
}

您的 FXML 文件也应该位于示例目录中。请注意,在上面的代码中,我将 VBOX 变量的名称更改为 vbox 以更好地适应标准 Java 命名约定。要使其工作,变量名称必须与 FXML 中的 fx:id 说明符匹配(因此将 fx:id="VBOX" 更改为 fx:id="vbox")。此外,控制器需要在 FXML fx:controller="sample.Controller"(您已经拥有)中设置。

【讨论】:

  • 感谢您不仅帮助我完成程序,还帮助我扩展了 JavaFx 知识
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多