JavaFX不像在fxml中那样加载css

时间:2014-01-23 14:51:11

标签: 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文件时,表列的宽度适当为55px,但是当我运行程序时,表列的默认宽度为80像素。目标当然是使列55px的宽度。

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

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

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

现在,解决方案是创建一个fxml控制器类并以编程方式设置宽度的值。我意识到这对你的解决方案来说可能并不完全理想,但它看起来确实很好。例如:

我的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>

我的主要课程是相同的,现在我的控制员:

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控制器设置器字段中奇怪的'filechooserexample'包标签,我正在重复使用我已设置的大部分空白项目以及所有内容。因此,设置控制器的代码是:`fx:controller =“packageName.NameOfJavaClassNoExtension”'

使用该代码我能够成功设置pref宽度。现在,你可以使用css来设置表格列的样式,你不能使用-fx-pref-width,因为我很确定该属性不存在。如果您想要了解允许的内容: caspian.css leview-resize-after-moved这是所有javafx的默认.css样式表。您可能会在其中找到一两个属性,但不会发现您将始终看到的吨和吨。

另外值得注意的是,要正确访问表列,.table-column将无法正常工作,我不这么认为。您可能需要使用getStyleClass().add("myCustomStyle");

添加样式

然后您可以使用.myCustomStyle

进行访问 祝你好运!我希望有所帮助。