java - JavaFX - 元素未显示
问题描述
我最近决定开始使用 JavaFX,但我似乎遇到了问题。当我运行应用程序时,我的元素不会显示。我四处搜索,但据我发现,我的代码要么没问题,要么人们似乎以编程方式创建他们的元素,我不想这样做。我只想使用 ScreenBuilder 进行设计。
这是我的main
:
package ParolaPM;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("login.fxml"));
primaryStage.setTitle("Parola PM");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
这是我的控制器:
package ParolaPM;
import javafx.fxml.FXML;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
public class Controller {
@FXML
public AnchorPane ancPane;
@FXML
public ImageView imgLogo;
@FXML
public void initialize() {
}
}
这是fxml
:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<AnchorPane fx:id="ancPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="327.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ParolaPM.Controller">
<children>
<ImageView fx:id="imgLogo" fitHeight="150.0" fitWidth="200.0" layoutX="21.0" layoutY="50.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../resources/lock.png" />
</image>
</ImageView>
</children>
</AnchorPane>
如下图所示,在第 9 行和第 11 行我有那个小图标,这意味着控制器检测到fxml
文件中的元素,当我单击它们时,它还会将我引导到该文件中的那些元素。
我对此很陌生,所以我真的不知道我做错了什么。在我当前的应用程序中,我只有一个图像,但是当我运行它时,什么都没有显示,如下图所示。
另一个有趣的事情是,如果我的@FXML
元素Controller
是private
而不是public
,它们会变灰。
这几天我一直在为此苦苦挣扎。我真的很感激任何帮助!
编辑:
感谢c0der,它适用于链接。我想我已经确定了问题的核心。
如果您通过 ScreenBuilder 选择一个图像,它有一个小@
标志,该标志进入代码<Image url="@../../resources/lock.png" />
。
所以,根据我的编程经验,正确的 URL 不应该有@
,但是如果你删除它,程序会抛出IllegalArgumentException
. 基本上,如果它在那里,它不会显示图像,如果不是,则显示错误。
我也尝试手动编写。有/没有<Image></Image>
. 最后两个有和没有的一堆不同组合,@
它不起作用。至少链接可以工作,但不应该是这样的。如果我没有发现它有什么问题以及为什么会这样,我想我会把它作为一个错误提交。
编辑2:
我似乎对@
. 根据我在这个线程中找到的官方文档链接,用于指定相对于文件路径。因此,它应该可以工作。有趣的...@
fxml
编辑 3:
Max在此线程中的解决方案似乎也有效。在 SceneBuilder 中选择路径旁边的“齿轮”并选择“绝对路径”选项。在fxml
文件中,路径将如下所示<Image url="file:/home/user/IdeaProjects/App/resources/lock.png" />
。不幸的是,同一线程中的相对路径解决方案似乎不起作用。
问题是,据我所知,如果我使用绝对的,一旦我在另一台机器上启动应用程序,它就不会加载图像。
编辑4:
找到了相对路径的解决方案。图像文件夹必须在src/Application
文件夹中。然后,您可以从 SceneBuilder 中选择它,并选择相对路径选项,并且图像将显示在 Builder 和运行应用程序时。
结构:
场景生成器:
然后FXML图像代码会自动写成:<Image url="@img/lock.png" />
解决方案
我fx:controller="ParolaPM.Controller
从 fxml 中删除并使用
<Image url="http://www.digitalphotoartistry.com/rose1.jpg" />
(使用之前测试过的路径进行测试总是一个好主意) - 它运行良好。
您一定会遇到异常。
(它也应该与控制器一起使用,因为它不做任何事情)
推荐阅读
- python - 在 python 列表中搜索和替换文本
- php - 如何为构造函数指定 void 返回类型
- nuxt.js - 与 nuxt-i18n 一起使用时,nuxt 站点地图无法正常工作
- c - XLib:改变子窗口的不透明度(MPV)
- javascript - 使用 React-Native-Contacts 时应用程序崩溃
- google-drive-api - 使用 google drive API V3 限制文件下载
- java - 我可以通过一次开始检查添加多个条件吗?
- javascript - 为什么我的属性“cursor:progress”在 Js 过渡期间无法正确显示?
- oracle - PL/SQL 中是否有机会将变量的名称作为字符串获取?
- linux - LFS:9.1 - 6.10 readelf 缺少 libdebuginfod.so.1