Quand je peins l'arrière-plan d'une colonne, puis je fixe la taille d'une cellule, cela se produit lorsque je caché une colonne: JavaFX 8 TableView: Si la propriété FixedCellSize est utilisé, une colonne ne peut pas être caché
Si je commente cette ligne: « table.setFixedCellSize (24) » fonctionne correctement:
Mais je dois fixer la taille d'une cellule ... ¿Est-ce que cette erreur a des solutions?
Un grand merci à tous et désolé pour mon pauvre anglais.
Vous pouvez exécuter mon exemple:
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Test extends Application {
@Override
public void start(final Stage stage) {
// Create Items
final ObservableList<Person> data =
FXCollections.observableArrayList(new Person("Ruben", "Martin"),
new Person("Ruben", "Martin"), new Person("Ruben", "Martin"));
// Create columns
final TableColumn<Person, String> firstNameCol =
new TableColumn<>("First Name");
firstNameCol.setCellValueFactory(
new PropertyValueFactory<>("firstName"));
final TableColumn<Person, String> lastNameCol =
new TableColumn<>("Last Name");
lastNameCol.setCellValueFactory(
new PropertyValueFactory<>("lastName"));
// Create Table
final TableView<Person> table = new TableView<>();
table.setFixedCellSize(24);
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol);
// Create CheckBox
final CheckBox checkLastName = new CheckBox();
checkLastName.setText("Last Name");
checkLastName.setSelected(true);
lastNameCol.setStyle("-fx-background-color:yellow");
lastNameCol.visibleProperty().
bindBidirectional(checkLastName.selectedProperty());
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(table, checkLastName);
final Scene scene = new Scene(new Group());
stage.setWidth(450);
stage.setHeight(550);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static void main(final String[] args) {
launch(args);
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private Person(final String fName, final String lName) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
}
public String getFirstName() {
return this.firstName.get();
}
public void setFirstName(final String fName) {
this.firstName.set(fName);
}
public String getLastName() {
return this.lastName.get();
}
public void setLastName(final String fName) {
this.lastName.set(fName);
}
}
}
Cela semble être un bug dans JavaFX: https://bugs.openjdk.java .net/browse/JDK-8156090 Malheureusement, comme il n'existe pas dans Java 9 (qui n'est pas encore sorti), il semble qu'il ait été jugé indigne d'un correctif. – Itai
Je vois en quelque sorte d'où cela vient. En général, dans JavaFX, un nœud qui n'est pas «visible» occupe toujours de l'espace dans le graphe de la scène, en supposant qu'il est «géré». Il est donc logique qu'une colonne non visible occupe le même espace, qu'elle soit visible ou non. Si la taille de la cellule n'est pas fixe, alors les cellules d'une colonne non visible n'affichent rien, donc leur largeur préférée serait 0. OTOH, si la taille de la cellule est fixe, elle fixe la largeur de la colonne. Ce n'est probablement pas le comportement désiré, mais je vois comment cela se produit. –