2017-02-21 7 views
0

私はカスタムセルファクトリを作成しました。ほとんどの値は正しく表示されますが、一部の値は正しく表示されません。私が細胞を膨張させて崩壊させると、問題は悪化する。奇妙なことは、継承されたsetText()メソッドが期待通りに機能していることです。なぜ私はこれが機能していないのか理解するためにsetText()メソッドを使用しています。私のカスタムコンテンツの左側にあるsetText()メソッドの内容に気づくでしょう。Javafxのカスタムセルファクトリノードは動作しませんが、セルファクトリのsetText()メソッドは継承されています

最初のセルを見ると、私のカスタムセルの内容は表示されません(最も顕著なのは、TextFlowノードが表示されないことです)。しかし、setText()の内容は、私はifステートメントロジックが期待どおりに動作していることを知っています。一体何が起こっているすべてのアイデア?以下

コードです:

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)

答えて

1

セルが再利用されると、あなたは時々innerVB最後のelse節で作成した新しいGridPaneの子を行います。 innerVBはすでに別の親の子ノードです(grid、および可能であれば同じelse節の以前の呼び出しで作成されたグリッド・ペインもあります)。これは、シーングラフのルールに違反します(ノードは1つの親の子にしかなりません)。予想外の表示が得られるほどレイアウトが混乱する可能性があります。

あなたはおそらくどちらか

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

または

grid.addRow(0, innerVB); 

必要に応じて、その後

grid.getChildren().clear(); 

updateItem()が呼び出されるたびにやる、とすべきです。

+0

常に明るいです。ありがとう!チャンピオンのように働く – MarsTwo

関連する問題