我在我的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
感谢任何帮助。
答案 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