因此,我正在使用JavaFX和FXML文件在Java中创建应用程序,而不是在Java中编写UI。添加该项目正在Gradle中进行。
我正在使用样式表来配置我的UI,但是在SceneBuilder中它的显示效果很好,但是在编译和运行代码后,样式表无法加载。
下面是我当前的文件结构(删除了一些内容)
src
`-- Main
|-- java
| |-- Controller
| | `-- mainWindowController.java
| `-- Main.java
`-- resources
|-- FXMLs
| `-- mainWindow.FXML
|-- Pictures
| `-- image.png
`-- stylesheet.css
下面是FXML文件调用样式表的部分。
<AnchorPane fx:id="BG" prefHeight="674.0" prefWidth="782.0" stylesheets="@../stylesheet.css" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.sony.TCOCalculator.Controller.mainWindowController">
<children...> //Cut out this section
</AnchorPane>
现在编译时出现错误
Oct 17, 2018 11:53:21 AM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
INFO: Could not find stylesheet: file:/C:/Users/(username)/AppData/Local/Temp/stylesheet.css
我很困惑为什么会这样,更何况编译器为什么要在我的temp文件夹中查找样式表。尝试查看图像时会发生相同的问题,该图像在Scenebuilder中有效,但在运行时不会很快。
下面是我主要的FXML文件调用位置。
public class Main extends Application
{
private static final String mainWindow = "FXMLs/mainWindow.fxml";
private static final String mainIcon = "Pictures/mainIcon.ico";
private static final Logger logger = LogManager.getLogger(Main.class.getName());
public static void main(String[] args)
{
logger.debug("Main class has started");
launch(args);
}
@Override
public void start(Stage primaryStage)
{
try
{
File mainScene = openFile(mainWindow,true);
if (mainScene != null)
{
FXMLLoader sceneLoader = new FXMLLoader(mainScene.toURI().toURL());
Parent root = sceneLoader.load();
root.getStylesheets().add("stylesheet.css");
mainWindowController controller = sceneLoader.getController();
logger.info("{} retrieved successfully", controller);
logger.info("{} loaded successfully", mainWindow);
if (root != null)
{
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.setTitle("TCO Calculator by Sony");
primaryStage.setResizable(false);
primaryStage.getIcons().add(new Image(mainIcon));
primaryStage.setOnHidden(event ->
{
controller.shutdown();
Platform.exit();
});
primaryStage.show();
}
else
logger.error("Could not open main scene");
}
}
catch (Exception e)
{
logger.error("File does not exist", e);
Platform.exit();
}
}
您会注意到我在Main Java代码中手动添加了样式表,但这只是一个变通方法,直到我真正解决了问题。我的图片有很多问题,我更喜欢将它们添加到FXML文件而不是Java代码中,因此删除变通方法并使用.FXML加载这些内容将是一个更好的选择。 / p>
OpenFile方法如下:
public static File openFile(String path, boolean resource)
{
InputStream inFromFile;
try
{
if (resource)
inFromFile = ClassLoader.getSystemClassLoader().getResourceAsStream(path);
else
inFromFile = new FileInputStream(path);
if (inFromFile == null)
{
return null;
}
File tempFile = File.createTempFile(String.valueOf(inFromFile.hashCode()), ".tmp");
tempFile.deleteOnExit();
try(FileOutputStream tempWriter = new FileOutputStream(tempFile))
{
//copy stream
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead = inFromFile.read(buffer)) != -1)
{
tempWriter.write(buffer, 0, bytesRead);
}
}
return tempFile;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}