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