当前位置: 首页 > 知识库问答 >
问题:

如何在FXML中添加CSS样式表

司徒阳曜
2023-03-14

我想将css文件链接到我的应用程序。在我的fxml文件中,我使用以下命令:

  <stylesheets>
    <URL value="@../stylesheet1.css" />
  </stylesheets>

...当我在scenebuilder中打开fhtml" target="_blank">xml文件时,我可以看到一个样式化的预览。但是,当我尝试运行应用程序时,出现了一个错误:

java.net.MalformedURL异常:无协议:.../stylesheet1.css

所以我用这种方法测试它:

<stylesheets>
    <String fx:value="stylesheet1.css" />
</stylesheets>

现在它是反过来的-应用程序启动并应用css,但我没有看到场景构建器中的预览。错误消息:

"文件stylesheet1.css不存在。资源stylesheet1.css找不到”。

那么如何正确附加css文件呢?

嗯,虽然我的问题没有得到回答,为什么它不能以上述方式工作,但我找到了一个适合我的解决方案。在我的FXML中,我只有一行

<?scenebuilder-stylesheet ../stylesheet1.css?>

所以SceneBuilder与css一起工作。在我的主类中,我以编程方式设置样式表:

Scene scene = new Scene(root);
String css = this.getClass().getResource("../stylesheet1.css").toExternalForm(); 
scene.getStylesheets().add(css);

共有3个答案

汪正卿
2023-03-14

如果您不想以编程方式进行,可以通过分离代码和资源来实现。我有一个像这样的Maven项目结构,但这不是一个要求。

src/main/java/${packageName}
    MainWindow.fxml
src/main/resources/${packageName}
    stylesheet1.css

现在,您可以在. fxml中使用样式表。

stylesheets="@stylesheet1.css"

或者像您一样使用样式表标记。

SceneBuilder中可能有警告,但它可以工作。

郜彦
2023-03-14

这里有一个在开发环境、场景生成器和打包的JAR中工作的解决方案。

文件夹结构:

主要的爪哇:

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {

            FXMLLoader loader = new FXMLLoader(Main.class.getResource("view/RootLayout.fxml"));
            AnchorPane rootLayout = (AnchorPane) loader.load();

            Scene scene = new Scene(rootLayout, 400, 400);
            scene.getStylesheets().add(getClass().getResource("css/application.css").toExternalForm());

            primaryStage.setScene(scene);
            primaryStage.show();

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

RootLayout.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.view.RootLayoutController">
   <children>
      <Pane layoutX="0.0" layoutY="0.0" prefHeight="200.0" prefWidth="200.0">
         <children>
            <Button fx:id="sunButton" layoutX="74.0" layoutY="88.0" mnemonicParsing="false" onAction="#handleSunButtonClick" styleClass="sun-button" stylesheets="@../css/toolbar.css" text="Button" />
         </children>
      </Pane>
   </children>
</AnchorPane>

RootLayoutController。爪哇:

package application.view;

import javafx.fxml.FXML;
import javafx.scene.control.Button;

public class RootLayoutController {


    @FXML
    Button sunButton;

    @FXML
    public void handleSunButtonClick() {
        System.out.println( "Button clicked");
    }
}

工具栏。css:

.sun-button {
  -fx-graphic: url('./icons/sun.png');
}

application.css:

.root {
    -fx-background-color:lightgray;
}

太阳巴布亚新几内亚:

这在开发环境和打包JAR(在Eclipse中选择“将所需库提取到生成的JAR中”)时都有效。

屏幕截图(只是一个按钮,带有通过css加载的图标)

万俟玉书
2023-03-14

我发现在fxml中包含css文件的可用和工作解决方案是将样式表="@app/cssfilename.css"添加fxml文件的父节点,就像堆栈窗格一样

<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.fxml.SettingsController" stylesheets="@app/cssfilepath.css">

......
.....
.....
</StackPane>
 类似资料:
  • 在Oracle教程http://docs.Oracle.com/javafx/2/get_started/fxml_tutorial.htm之后,我使用一个片段创建了FXML NetBeans 8.0将URL涂成红色,并表示:“class dostnot exist:URL”。 似乎每个人都在使用元素,为什么我不能呢?

  • 我已将这些字体样式添加到我的页面 如何使用css将它们添加到我的页面中,以便我的css中没有这些外部链接 我试过这个 但在我的控制台(我使用Mlozilla)中 可下载字体:被消毒剂拒绝 在Chrome错误说: 无法解码下载的字体:https://fonts.googleapis.com/css?family=Roboto:400,700700Italic,400italic 然后我下载了与Rob

  • 我有一个,我想为它设置。 我知道我可以用div包装它,并控制该div的子级的CSS,但如果可能的话,我希望避免多余的包装。 PrimeFaces版本:3.5。

  • 问题内容: 我想知道,如果它是一个可以添加在我的风格或任何其他方式来增加边界? 喜欢 : 的CSS HTML 问题答案: 边框可以沿剪切路径应用于剪切后的元素吗? 不,向剪贴元素添加属性不会沿剪贴路径应用边框,因为会在应用于之前在原始矩形(或正方形)容器上应用,因此也会被剪切掉。您可以在下面的代码段中看到它: 有没有其他方法可以创建这样的边框效果? 我们可以通过将其应用于容器元素来模仿它。容器元素

  • 问题内容: 我正在使用 jQuery* 更改 CSS ,并希望根据输入值删除要添加的样式: * 我怎样才能做到这一点? 请注意,只要使用颜色选择器选择了颜色(即,当鼠标移至色轮上时),以上行就会运行。 第二注:我不能这样做,因为它将从 CSS* 文件中删除默认样式。 我只想删除 jQuery添加的内联样式。 * 问题答案: 将属性更改为空字符串似乎可以完成此工作:

  • 问题内容: 我使用PHP显示来自MySQL的数据。这是我的css语句: 它们用于显示表,表头,表日期。我是php CSS的新手,所以我只是想知道如何在php中使用上述CSS样式显示代码: 问题答案: 级联样式表(CSS)是一种样式表语言,用于描述以标记语言编写的文档的表示语义(外观和格式)。 : CSS不是一种编程语言,并且没有服务器端语言(如PHP)随附的工具。但是,我们可以使用服务器端语言来生