2016-08-03 70 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; 
}