我最近决定开始使用JavaFX,但似乎遇到了问题。 运行应用程序时,我的元素不会显示。我在Google周围搜索,但是从我发现的结果来看,我的代码要么还可以,要么人们似乎以编程方式创建其元素,而我不想这样做。我只想使用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:
我似乎对@
不正确。根据我在the official documentation link中发现的this thread,fxml
用于指定相对于fxml
文件路径的相对路径。因此,它应该正在工作。有趣的...
编辑3:
this thread中的 Max 解决方案似乎也可以工作。在SceneBuilder中选择路径旁边的“齿轮”,然后选择“绝对路径”选项。在<Image url="file:/home/user/IdeaProjects/App/resources/lock.png" />
文件中,路径将类似于src/Application
。不幸的是,同一线程中的相对路径解决方案似乎不起作用。
据我所知,问题是,如果我使用绝对版本,一旦在另一台计算机上启动该应用程序,它将无法加载图像。
编辑4:
找到了相对路径的解决方案。
图像文件夹 必须 在<Image url="@img/lock.png" />
文件夹中。然后,您可以从SceneBuilder中选择它,并选择相对路径选项,当运行应用程序时,图像将显示在Builder AND中。
结构:
SceneBuilder:
然后,FXML图像代码将自动写为:word
word
word
答案 0 :(得分:1)
我从fxml中删除了fx:controller="ParolaPM.Controller
并通过
<Image url="http://www.digitalphotoartistry.com/rose1.jpg" />
(最好使用以前测试过的路径进行测试)-效果很好。
您必须获得例外。
(它也应该与控制器一起使用,因为它什么也不做)