gpt4 book ai didi

java - 如何使用 FX :ID JavaFx 查看网页

转载 作者:行者123 更新时间:2023-11-30 08:36:27 25 4
gpt4 key购买 nike

我想知道我构建了一个 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;

}

最佳答案

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

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

您也不应该在您的应用程序中使用 @FXML 字段,因为那是没有意义的。 @FXML 仅在 Controller 中才有意义.应用程序通常不是(也不应该是) Controller 。如果是这样,它会导致问题,因为通常情况下,FXMLLoader 会在您加载新的 FXML 时创建一个新的 Controller。在您的应用程序中拥有多个应用程序实例是没有意义的,一个由 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"(您已经拥有)中设置 Controller 。

关于java - 如何使用 FX :ID JavaFx 查看网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37757517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com