2017-02-21 1 views
0

J'ai fait une fabrique de cellules personnalisée. La plupart des valeurs s'affichent correctement mais d'autres non. Au fur et à mesure que je dilate et écrase les cellules, le problème s'aggrave. La chose étrange est la méthode héritée setText() fonctionne comme prévu. J'utilise seulement la méthode setText() pour m'aider à comprendre pourquoi cela ne fonctionne pas. Vous remarquerez le contenu de la méthode setText() à gauche de mon contenu personnalisé.Les nœuds d'usine de cellules personnalisées Javafx ne fonctionnent pas mais la méthode setText() héritée dans l'usine Cell est

En regardant la première cellule, vous remarquerez qu'aucun de mes contenus de cellules personnalisés ne s'affiche (le plus notable étant que le nœud TextFlow ne s'affiche pas). Cependant, le contenu de setText() le fait, donc je sais que la logique des instructions if fonctionne comme prévu. Des idées sur ce qui se passe?

ci-dessous est le code:

import java.util.Collections; 
import java.util.List; 

import javafx.collections.ObservableList; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.TreeItem; 
import javafx.scene.control.TreeTableCell; 
import javafx.scene.control.TreeTableRow; 
import javafx.scene.control.TreeTableView; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 
import javafx.scene.text.TextFlow; 

public class CellValueMaker extends TreeTableCell<ProviderAttribute, ProviderAttribute>{ 

    ImageView up; 
    ImageView down; 
    GridPane grid; 
    Text cellName; 
    Text cellDesc; 
    Label serialNumber; 
    VBox innerVB; 
    GridPane innerLowerGrid; 
    ImageButton upButton; 
    ImageButton downButton; 
    TextFlow flow; 

    public CellValueMaker(){ 
     up = new ImageView(new Image(getClass().getResourceAsStream(
       "/resources/up.png"))); 
     up.setFitHeight(15); 
     up.setFitWidth(15); 
     upButton = new ImageButton(up); 

     down = new ImageView(new Image(getClass().getResourceAsStream(
       "/resources/down.png"))); 
     down.setFitHeight(15); 
     down.setFitWidth(15); 
     downButton = new ImageButton(down); 

     grid = new GridPane(); 
     innerVB = new VBox(); 
     innerVB.setPadding(new Insets(0, 0, 0, 3)); 
     innerLowerGrid = new GridPane(); 

     serialNumber = new Label(""); 
     serialNumber.setFont(Font.font ("System", 10)); 
     innerLowerGrid.add(serialNumber, 1, 0); 
     cellName = new Text(""); 
     cellDesc = new Text(""); 
     cellDesc.setStyle("-fx-font-weight: bold"); 
     flow = new TextFlow(); 
     flow.getChildren().addAll(cellDesc, cellName); 



     innerVB.getChildren().addAll(flow, serialNumber); 

     upButton.setOnMouseClicked(new OnMoveUp()); 
     downButton.setOnMouseClicked(new OnMoveDown()); 

     // set lower nested grid 
     grid.add(upButton, 0, 0); 
     grid.add(downButton, 1, 0); 
     grid.add(innerVB, 2, 0); 
     setGraphic(grid); 
    } 

    @Override 
    public void updateItem(ProviderAttribute item, boolean empty){ 
     super.updateItem(item, empty); 

     if(item == null || empty){ 
      setGraphic(null);  
      setText(""); 
      setStyle("-fx-background-color: white;"); 
      cellName.setText(""); 
      cellDesc.setText(""); 
     }else{ 
      if(item instanceof DigitalIdentityType){ 
       DigitalIdentityType certBean = item.getEncapsulatedBean(); 
       setGraphic(grid); 
       cellName.setText(item.getStringName()); 
       cellDesc.setText("Cert: "); 
       setText(item.getStringName()); 
       setStyle("-fx-background-color: darkkhaki;"); 
       if(certBean.getParentCert() != null){ 
        serialNumber.setText("SN: " + certBean.getParentCert().getSerialNumber().toString()); 
       } 
      }else if(item instanceof TSPServiceType){ 
       setGraphic(grid); 
       cellName.setText(item.getStringName()); 
       serialNumber.setText(""); 
       cellDesc.setText("Service: "); 
       setStyle("-fx-background-color: lightblue;"); 
       setText("Service: " + item.getStringName()); 
      }else if(item instanceof TSPType){ 
       setGraphic(grid); 
       cellName.setText(item.getStringName()); 
       serialNumber.setText(""); 
       cellDesc.setText("TSP: "); 
       setText("TSP: " + item.getStringName()); 
       setStyle("-fx-background-color: bisque;"); 
      }else{ 
       GridPane pane = new GridPane(); 
       pane.add(innerVB, 0, 0); 
       setGraphic(pane); 
       setText(item.getStringName()); 
       serialNumber.setText(""); 
       setStyle("-fx-background-color: white;"); 
//    cellName.setText(item.getStringName()); 
      } 
     } 

    } 

    public class OnMoveUp implements EventHandler<MouseEvent>{ 
     private final String STYLE_PRESSED = "-fx-background-color: transparent; -fx-padding: 3 1 1 3;"; 

     @SuppressWarnings("unchecked") 
     @Override 
     public void handle(MouseEvent event) { 
      Button button = (Button)event.getSource(); 
      button.setStyle(STYLE_PRESSED); 

      // get the table 
      TreeTableView<ProviderAttribute> table = (TreeTableView<ProviderAttribute>) 
        button.getParent().getParent().getParent() 
        .getParent().getParent().getParent().getParent(); 

      // get the item 
      TreeTableRow<ProviderAttribute> row = (TreeTableRow<ProviderAttribute>) 
        button.getParent().getParent().getParent(); 
      ProviderAttribute itemValue = row.getItem(); 
      TreeItem<ProviderAttribute> item = row.getTreeItem(); 

      ObservableList<TreeItem<ProviderAttribute>> list = item.getParent().getChildren(); 

      if(item == null || list == null || list.size() <= 1) return; 

      // swap the current item with the one above it 
      int index = getIndexOf(list, itemValue); 
      if(index > 0){ 
       Collections.swap(list, index, index-1); 
       table.getSelectionModel().clearSelection(); 
      } 
     } 

    } 

    public class OnMoveDown implements EventHandler<MouseEvent>{ 
     private final String STYLE_PRESSED = "-fx-background-color: transparent; -fx-padding: 3 1 1 3;"; 

     @SuppressWarnings("unchecked") 
     @Override 
     public void handle(MouseEvent event) { 
      Button button = (Button)event.getSource(); 
      button.getGraphic().setOpacity(50); 
      button.setStyle(STYLE_PRESSED); 

      // get the table 
      TreeTableView<ProviderAttribute> table = (TreeTableView<ProviderAttribute>) 
        button.getParent().getParent().getParent() 
        .getParent().getParent().getParent().getParent(); 

      // get the item 
      TreeTableRow<ProviderAttribute> row = (TreeTableRow<ProviderAttribute>) 
        button.getParent().getParent().getParent(); 
      ProviderAttribute itemValue = row.getItem(); 
      TreeItem<ProviderAttribute> item = row.getTreeItem(); 

      ObservableList<TreeItem<ProviderAttribute>> list = item.getParent().getChildren(); 
      if(item == null || list == null || list.size() <= 1) return; 

      int index = getIndexOf(list, itemValue); 
      if(index < list.size() - 1){ 
       Collections.swap(list, index, index+1); 
       table.getSelectionModel().clearSelection(); 
      } 
     } 

    } 

    public int getIndexOf(List<TreeItem<ProviderAttribute>> items, ProviderAttribute bean){ 
     int index = -1; 
     for(int i = 0; i < items.size(); i++){ 
      if(items.get(i).getValue().equals(bean)) 
       return i; 
     } 

     return index; 
    } 

    public class ImageButton extends Button { 
    private final String STYLE_NORMAL = "-fx-background-color: transparent; -fx-padding: 2, 2, 2, 2;"; 

    public ImageButton(ImageView image) { 
     setGraphic(image); 
     setStyle(STYLE_NORMAL); 


     setOnMouseReleased(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       setStyle(STYLE_NORMAL); 
//    setOpacity(0); 
      }    
     }); 
    } 

} 

// public class EventHandler 
} 

TableTreeView (notice the contents of the first cell is not bold)

Répondre

1

Comme la cellule est réutilisée, vous fera parfois innerVB un enfant du nouveau GridPane créé dans la dernière clause else; cependant, innerVB est déjà un noeud enfant d'un autre parent (grid, et éventuellement aussi des panneaux de grille créés précédemment dans les invocations précédentes de la même clause else). Cela viole les règles du graphe de scène (un noeud ne peut être qu'un enfant d'un parent) et risque de perturber la mise en page suffisamment pour que vous obteniez un affichage imprévisible.

Vous devriez probablement faire

grid.getChildren().clear(); 

chaque fois updateItem() est appelé, puis soit

grid.addRow(0, upButton, downButton, innerVB); 

ou

grid.addRow(0, innerVB); 

au besoin.

+0

Brillant comme toujours. Merci mon pote! Fonctionne comme un champion – MarsTwo