У меня проблема с CSS для компонента, когда используется fx:factory
, дополнительное свойство gridLinesVisible, похоже, тоже не работает.Позвольте мне перейти к сути, мой компонент выглядит так:
<?import javafx.scene.layout.GridPane?>
<fx:root type="javafx.scene.layout.GridPane" xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1" maxWidth="400.0" prefWidth="220.0"
stylesheets="@custom.css" styleClass="grid" gridLinesVisible="true">
</fx:root>
И я использую его так:
<MyCustomView fx:id="myCustomView" prefHeight="240.0" rotate="-90" alignment="CENTER"
fx:factory="createMyCustomView"/>
И код для фабричного метода выглядит так:
public static MyCustomView createMyCustomView() {
ObservableList<RowView> rowViews = FXCollections.observableArrayList();
for (int i = 0; i < 20; i++) {
RowView rv = new RowView();
rv.setRow(i);
rowViews.add(rv);
}
MyCustomView view = new MyCustomView();
view.setRows(rowviews);
return view;
}
Я попытался установить таблицы стилей и styleClass в конструкторе, фабричном методе, контроллере и FXML, но ничего не работает.Но когда я убираю вызов fx:factory="createMyCustomView"
CSS и свойство gridLinesVisible работают.У меня нет больше идей, чтобы попробовать.
Приветствия, Рафал
РЕДАКТИРОВАТЬ
Я немного изменил проект;вот my_custom_view.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.collections.FXCollections?>
<?import sample.RowView?>
<fx:root type="sample.MyCustomView" xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1" maxWidth="400.0" prefWidth="250.0"
stylesheets="@custom.css" styleClass="grid" gridLinesVisible="true">
<rows>
<!--If using views defined inside the view gridlines and css work-->
<FXCollections fx:factory="observableArrayList">
<RowView row="1"/>
<RowView row="2"/>
<RowView row="3"/>
<RowView row="4"/>
<RowView row="5"/>
<RowView row="6"/>
<RowView row="7"/>
<RowView row="8"/>
</FXCollections>
</rows>
</fx:root>
Вот класс MyCustomView:
package sample;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import java.io.IOException;
import java.lang.ref.WeakReference;
public class MyCustomView extends GridPane {
private static final String FXML_RESOURCE_PATH = "my_custom_view.fxml";
public MyCustomView() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(FXML_RESOURCE_PATH));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void insertRowsAndLabels() {
this.getChildren().clear();
if (rows.get() != null) {
for (RowView rv : rows.get()) {
Label label = new Label(String.valueOf(rv.getRow()));
Group group = new Group(label);
group.setRotate(90);
this.add(group, 1, rv.getRow());
this.add(rv, 0, rv.getRow());
}
}
}
public final ObjectProperty<ObservableList<RowView>> rowsProperty() {
return rows;
}
private ObjectProperty<ObservableList<RowView>> rows =
new SimpleObjectProperty<ObservableList<RowView>>(this, "rows") {
WeakReference<ObservableList<RowView>> oldItemsRef;
@Override
protected void invalidated() {
final ObservableList<RowView> oldItems = oldItemsRef == null ? null : oldItemsRef.get();
final ObservableList<RowView> newItems = getRows();
// Fix for RT-36425
if (newItems != null && newItems == oldItems) {
return;
}
oldItemsRef = new WeakReference<>(newItems);
}
};
public final void setRows(ObservableList<RowView> value) {
rowsProperty().set(value);
insertRowsAndLabels();
}
public final ObservableList<RowView> getRows() {
return rows.get();
}
public final BooleanProperty autoFillProperty() {
if (autoFill == null) {
autoFill = new SimpleBooleanProperty(this, "autoFill", false);
}
return autoFill;
}
private BooleanProperty autoFill;
public boolean getAutoFill() {
return autoFillProperty().get();
}
public void setAutoFill(boolean value) {
autoFillProperty().set(value);
}
public static MyCustomView createMyCustomView() {
ObservableList<RowView> rowViews = FXCollections.observableArrayList();
for (int i = 0; i < 20; i++) {
RowView rv = new RowView();
rv.setRow(i);
rowViews.add(rv);
}
MyCustomView view = new MyCustomView();
view.setRows(rowViews);
return view;
}
}
Вот основной файл FXML вида, sample.fxml:
<?import javafx.collections.FXCollections?>
<?import javafx.scene.layout.VBox?>
<?import sample.MyCustomView?>
<?import sample.RowView?>
<VBox fx:controller="sample.Controller"
xmlns:fx="http://javafx.com/fxml"
stylesheets="@custom.css">
<!--GridLines and css don't work here-->
<MyCustomView styleClass="grid" prefHeight="240.0" rotate="-90" alignment="CENTER"
fx:factory="createMyCustomView"/>
<!--GridLines and css don't work here-->
<MyCustomView styleClass="grid" prefHeight="240.0" rotate="-90" alignment="CENTER"
gridLinesVisible="true">
<rows>
<FXCollections fx:factory="observableArrayList">
<RowView row="1" rowName="test"/>
<RowView row="2" rowName="test"/>
<RowView row="3" rowName="test"/>
<RowView row="4" rowName="test"/>
<RowView row="5" rowName="test"/>
</FXCollections>
</rows>
</MyCustomView>
<!--This works-->
<MyCustomView prefHeight="240.0" rotate="-90" alignment="CENTER"/>
</VBox>
Я загрузил всекод для github https://github.com/spajo/ProblemExample