当前位置: 首页 > 知识库问答 >
问题:

如何使用fx:id JavaFx查看网页

曾景龙
2023-03-14
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);
    }
}
<?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;

}

共有1个答案

锺离良哲
2023-03-14

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

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

您也不应该在应用程序中设置@fxml字段,因为这没有任何意义。@fxml仅在控制器中才有意义。应用程序通常不是(也不应该是)控制器。如果是这样,就会引起问题,因为通常情况下,当您加载新的FXML时,FXMLLoader会创建一个新的控制器。在应用程序中有多个应用程序实例是没有意义的,一个是由java launcher创建的,另一个是由FXMLLoader创建的(这只会极大地混淆您)。有关这方面的更多信息,请参见JavaFX控制器类not working。

记住这一点,您的代码可以按照如下所示进行重构。

取样.主要

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);
    }
}

采样控制器

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);
    }
}
 类似资料:
  • 对于这样一个简单的问题,我感到很抱歉,但我发现很难相信在使用JavaFX SceneBuilder开发用户界面的同时,我实际上无法查看fxml。 null 即http://www.webhostingplanguide.com/wp-content/uploads/2013/12/coffeecup-html-editor.jpg 如上所述,我希望能够在FXML或所见即所得的前端工作。

  • 网格查看让你在表中查看、更新、插入或删除数据。网格的弹出菜单提供了以下额外功能:设置字段值为 Null 或空白字符串、使用当前字段值作为一个筛选、格式化网格查看、及以更多。 使用导览栏 表查看器 提供了一个便捷的方式来浏览记录或页使用 记录或页导览栏 按钮。全部按钮用于浏览左和右到前一或下一条记录或页。 记录导览栏 按钮 描述 新建记录:输入一个新记录。在任何时候当你在表网格查看中工作,点击这个按

  • 问题内容: 如何通过urllib获取标头的代码? 问题答案: getcode()方法(在python2.6中添加)返回与响应一起发送的HTTP状态代码;如果URL不是HTTP URL,则返回None。

  • 问题内容: 如何查看我使用的NumPy版本? (仅供参考,此问题已被编辑,因为问题和答案都不是特定于平台的。) 问题答案:

  • 我似乎不知道如何使用PDFBox及其PDFPagePanel组件查看PDF页面。 因此,使用PDFBox,我的选项似乎是创建PDPage对象或PDDocument对象的列表,我使用了PDPage列表(而不是对PDDocument对象使用) 下面的代码创建一个名为testPage的PDPage对象 在这里,我想创建一个并使用它的方法将PDPage放入组件中。从这里开始,我想将组件添加到JFrame中

  • 我如何访问Docker使用RoboMongo或类似工具创建的mongo数据库? 在使用Doncker之前,我已经在Linux机器上安装了mongodb。所以我不能在docker compse中使用端口“27017:27017”。yml。我使用“27018:27018”: 我可以使用RoboMongo查看我在预docker mongo中创建的所有数据库。但是我怎样才能进入码头工人的房间呢? 这是我的