2016-08-03 120 views
0

我有一个带有on栏的TableView包含一篇文章和一个带有价格的栏。我想在点击按钮时更改索引行的行的CSS。 我有这样的:在tableView中更改css行javafx

articleTable.setRowFactory(param -> new TableRow<LigneTicket>() { 
     @Override 
     protected void updateItem(LigneTicket paramT, boolean empty) { 

      super.updateItem(paramT, empty); 
      if (!isEmpty() && paramT != null && paramT.getArticle().isArticleAnnuler()) { 
       getStyleClass().add("articleCanceled"); 
       articleTable.refresh(); 
      } 
     } 
    }); 

但在我的tableView的改变此代码的工作,不只是在一个按钮的点击,并且它不是在一个索引行的工作选择。

请帮助,

感谢

回答

0

尝试使用一个黑客的事件之后:

for (Column col : articleTable.getColumns()) { 
    col.setVisible(false); 
    col.setVisible(true); 
} 
0

注意,没有一个1:表项和表行之间的关系1。

TableRow只对可见项目存在并且可能被重新分配一个值。因此,您需要小心地移除样式类。

此外,我不推荐使用样式类来标记行,我推荐使用伪类,这使得添加/删除更容易。

您可以将关于项目状态的数据存储在项目类本身中,或将其存储在合适的外部数据结构中。

以下示例在与ObservableMap中的项目关联的值更改时,向/从表格行添加/删除removed伪类。

按钮允许分配或清除选定行中的伪类。

你可以用索引而不是项目做类似的事情。

@Override 
public void start(Stage primaryStage) { 
    TableView<Item> tableView = new TableView<>(FXCollections.observableArrayList(
      new Item("a"), 
      new Item("b"), 
      new Item("c"), 
      new Item("d"), 
      new Item("e"), 
      new Item("f") 
    )); 
    tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

    ObservableMap<Item, Boolean> removed = FXCollections.observableHashMap(); 
    PseudoClass removedPseudoClass = PseudoClass.getPseudoClass("removed"); 

    tableView.setRowFactory(tv -> { 
     TableRow<Item> result = new TableRow<>(); 

     ObjectBinding<Boolean> binding = Bindings.valueAt(removed, result.itemProperty()); 
     binding.addListener((observable, oldValue, newValue) -> result.pseudoClassStateChanged(removedPseudoClass, newValue != null && newValue)); 

     return result; 
    }); 

    TableColumn<Item, String> column = new TableColumn<>("value"); 
    column.setCellValueFactory(td -> td.getValue().valueProperty()); 
    tableView.getColumns().add(column); 

    Button btn = new Button("remove"); 
    Button btn2 = new Button("add"); 

    btn.setOnAction(evt -> { 
     for (Item item : tableView.getSelectionModel().getSelectedItems()) { 
      removed.put(item, Boolean.TRUE); 
     } 
    }); 

    btn2.setOnAction(evt -> { 
     for (Item item : tableView.getSelectionModel().getSelectedItems()) { 
      removed.remove(item); 
     } 
    }); 

    Scene scene = new Scene(new VBox(10, tableView, btn, btn2)); 
    scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm()); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
public class Item { 

    public Item() { 
    } 

    public Item(String value) { 
     this.value.set(value); 
    } 

    private final StringProperty value = new SimpleStringProperty(); 

    public String getValue() { 
     return value.get(); 
    } 

    public void setValue(String val) { 
     value.set(val); 
    } 

    public StringProperty valueProperty() { 
     return value; 
    } 

} 

的style.css

.table-row-cell:filled { 
    -fx-background-color: lime; 
} 

.table-row-cell:filled:selected { 
    -fx-background-color: -fx-selection-bar; 
} 

.table-row-cell:filled:removed { 
    -fx-background-color: orange; 
} 

.table-row-cell:filled:removed:selected { 
    -fx-background-color: -fx-selection-bar; 
}