【问题标题】:JavaFX - Elements not showingJavaFX - 元素未显示
【发布时间】:2018-12-02 16:12:55
【问题描述】:

我最近决定开始使用 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 文件中的元素,当我单击它们时,它也会将我引导到这些元素在那个文件中。

我对此很陌生,所以我真的不知道我做错了什么。在我当前的应用程序中,我只有一个图像,但是当我运行它时,什么都没有显示,如下图所示。

另一个有趣的事情是,如果我在 Controller 中的 @FXML 元素是 private 而不是 public,它们会变灰。

我已经为此苦苦挣扎了好几天。非常感谢任何帮助!

编辑:

感谢c0der,它适用于链接。我想我已经确定了问题的核心。

如果您通过 ScreenBuilder 选择一个图像,它有一个小的 @ 符号,它进入代码 &lt;Image url="@../../resources/lock.png" /&gt;。

所以,根据我的编程经验,正确的 URL 不应该有 @,但是如果你删除它,程序会抛出 IllegalArgumentException。基本上,如果存在,则不显示图像,如果不存在,则显示错误。

我也尝试过手动编写。有/没有&lt;Image&gt;&lt;/Image&gt;。最后两个有和没有@ 的一堆不同组合,它不起作用。至少链接可以工作,但不应该是这样的。如果我没有发现它有什么问题以及为什么会这样,我想我会将它作为一个错误提交。

编辑 2:

我似乎对@ 不正确。根据我在this thread中找到的the official documentation link,@用于指定相对于fxml文件路径。因此,它应该可以工作。有趣...

编辑 3:

Max 在this thread 中的解决方案似乎也有效。在 SceneBuilder 中选择路径旁边的“齿轮”并选择“绝对路径”选项。在fxml 文件中,路径将类似于&lt;Image url="file:/home/user/IdeaProjects/App/resources/lock.png" /&gt;。不幸的是,同一线程中的相对路径解决方案似乎不起作用。

据我所知,这个问题是,如果我使用绝对的,一旦我在另一台机器上启动应用程序,它就不会加载图像。

编辑 4:

找到了相对路径的解决方案。 图片文件夹必须位于src/Application 文件夹中。然后,您可以从 SceneBuilder 中选择它,并选择相对路径选项,并且图像将显示在 Builder 中,并且当应用程序运行时。

结构:

场景构建器:

那么FXML图片代码会自动写成:&lt;Image url="@img/lock.png" /&gt;

【问题讨论】:

  • 我从 fxml 中删除了 fx:controller="ParolaPM.Controller" 并使用 &lt;Image url="http://www.digitalphotoartistry.com/rose1.jpg" /&gt; 进行了测试(使用之前测试过的路径进行测试总是一个好主意) - 它工作正常。您一定会遇到异常。 (它应该和控制器一样工作,因为它什么都不做)
  • 非常感谢!这行得通。一定是@../../resources/lock.png。这是由 JavaFX 程序自动编写的,因为我通过 SceneBuilder 中的选项选择了图像。编辑:如果你把它作为答案,我可以选择它作为解决方案,并给你绝对应得的分数!!!

标签: java intellij-idea javafx


【解决方案1】:

我从 fxml 中删除了 fx:controller="ParolaPM.Controller 并使用

进行了测试

&lt;Image url="http://www.digitalphotoartistry.com/rose1.jpg" /&gt;
(使用之前测试过的路径进行测试总是一个好主意) - 效果很好。
您一定会遇到异常。
(它也应该与控制器一起工作,因为它不做任何事情)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2017-08-26
    • 2015-09-24
    • 2016-11-12
    • 2021-07-12
    相关资源
    最近更新 更多