css - JavaFX 不像在 fxml 中那样加载 css

标签 css javafx-2 fxml

我在我的 FXML 文件中定义了一个 css 样式表,当使用 scenebuilder 打开该文件时,它可以正确显示,但当我运行该程序时,却无法正确显示。这让我很困惑...

这就是我正在处理的内容:

├───bin
│   └───app
│           application.css
│           Fxml.fxml
│           Main.class
│
└───src
    └───app
            application.css
            Fxml.fxml
            Main.java

我的 Fxml.fxml 文件如下所示:

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

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


<VBox prefHeight="100.0" xmlns="http://javafx.com/javafx/8"
    xmlns:fx="http://javafx.com/fxml/1">
    <children>
        <HBox prefHeight="20.0" />
        <TableView id="table" xmlns:fx="http://javafx.com/fxml">
            <columns>
                <TableColumn id="tablec_h_from" text="H_FROM" />
                <!-- other columns -->
            </columns>
        </TableView>
    </children>
    <stylesheets>
        <URL value="@application.css" />
    </stylesheets>
</VBox>

application.css 如下所示:

.table-column {
    -fx-pref-width: 55;
}

Main.java:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
            VBox root = null;
            try {
                root = (VBox)FXMLLoader.load(getClass().getResource("Fxml.fxml"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            Scene scene = new Scene(root);

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

    }
}

因此,正如我之前所说,当我使用场景生成器打开 FXML 文件时,表格列的正确宽度为 55 像素,但当我运行程序时,表格列的默认宽度为 80 像素。目标当然是使列的宽度为 55px。

即使我已经在 fxml 文件中定义了 css 文件,我是否也必须在 Main.java 中导入它?如果是这样,怎么办?

我正在使用 eclipse IDE 和 JavaFX 版本 2.2.45-b18

感谢任何帮助。

最佳答案

好吧,这个特定问题的问题在于 TableColumn 的本质。看起来 TableColumn 与 .css 没有任何真正的绑定(bind),更重要的是,即使您通过它的 css ID 访问它,属性 -fx-pref-width 似乎也不存在。这就是为什么你没有看到任何变化。另外,由于目前 javafx 中 tableView 潜在的错误性质,您必须设置一个 pref-width,否则事情会变得有点奇怪。看 This topic一些奇怪的例子。

现在,解决此问题的方法是创建一个 fxml Controller 类并以编程方式设置宽度值。我意识到这可能并不完全适合您的解决方案,但它似乎工作得很好。例如:

我的 FXML.fxml:

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

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

<VBox prefHeight="100.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller = "filechooserexample.fxmlController" >
  <children>
    <HBox prefHeight="20.0" />
    <TableView id="table">
      <columns>
        <TableColumn id="tablec_h_from" maxWidth="5000.0" minWidth="10.0" prefWidth="50.0" text="H_FROM" fx:id="myTableColumn" />
        <!-- other columns -->
      </columns>
      <stylesheets>
        <URL value="@application.css" />
      </stylesheets>
    </TableView>
  </children>
  <stylesheets>
    <URL value="@application.css" />
  </stylesheets>
</VBox>

我的主类是相同的,现在对于我的 Controller :

fxmlController.java: 

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableColumn;

/**
 *
 * @author William
 */
public class fxmlController implements Initializable{

    @FXML TableColumn myTableColumn;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        myTableColumn.setPrefWidth(200);
    }

}

请原谅 fxml Controller setter 字段中奇怪的“filechooserexample”包标记,我正在重用一个我已经设置好的几乎空白的元素和所有内容。因此,设置 Controller 的代码为:`fx:controller = "packageName.NameOfJavaClassNoExtension"'

使用该代码,我能够成功设置首选项宽度。现在,您可以使用 css 来设置表格列的样式,只是不能使用 -fx-pref-width ,因为我相当确定该属性不存在。如果您想更好地猜测允许的内容,请参阅: caspian.css leview-resize-after-been-moved 这是所​​有 javafx 的默认 .css 样式表。除此之外,您可能会发现一两处特性,但不会经常看到大量的特性。

还值得注意的是,要正确访问表列,.table-column 不起作用,我不认为。您可能需要使用 getStyleClass().add("myCustomStyle");

添加样式

然后您可以使用 .myCustomStyle 访问它

祝你好运!我希望这有帮助。

关于css - JavaFX 不像在 fxml 中那样加载 css,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21311523/

相关文章:

css - 将图标放入文本输入字段

javascript - 菜单使用 Bootstrap 将图像向下推到移动版本中?

html - CSS flex : How to get equal heights in flex rows

netbeans - JavaFX 2.0 + NetBeans + Maven

java FX : scene's lookup method

java - 应用程序启动方法中出现异常 java.lang.reflect.InitationTargetException JavaFX 图像转换

javascript - 我正在尝试让我的导航菜单向左滑动并用它插入正文

java - 通过单击按钮关闭模式窗口

java - 图形自动填充按钮

Javafx:使用 FXML 的可重用集合