gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 12:16:42 25 4
gpt4 key购买 nike

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

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

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com