2017-09-12 4 views
0

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: enter image description hereJavaFX 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: enter image description here

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); 
     } 
    } 
} 
+0

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

+0

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. –

Répondre

0

C'est probablement une solution mais il fonctionne:

StringBinding sb = Bindings.when(lastNameCol.visibleProperty()) 
       .then("-fx-background-color:yellow") 
       .otherwise(""); 
     lastNameCol.styleProperty().bind(sb);