2016-08-03 3 views
0

У меня TableView с колонкой on содержит статью и другой столбец с ценой. Я хотел бы изменить строку css строки в строке индекса, когда я нажимаю кнопку. у меня есть это:Изменить строку css в tableView 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

использовать Try один хак после события:

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

Обратите внимание, что не 1: 1 отношение между элементами таблицы и строки таблицы.

TableRow s существует только для видимых элементов и может быть переназначено значение. Поэтому вам необходимо позаботиться о том, чтобы удалить класс стиля.

Кроме того, вместо того, чтобы использовать класс стиля для маркировки строк, я рекомендую использовать псевдокласс, что позволяет упростить добавление/удаление.

Вы можете сохранить данные о состоянии элемента в самом классе элементов или сохранить его в подходящей внешней структуре данных.

В следующем примере добавляются/удаляются строки псевдокласса removed в/из таблицы, когда изменяется значение, связанное с элементом в ObservableMap.

Кнопки позволяют назначать или очищать псевдослот из выбранных строк.

Вы можете сделать аналогичную вещь с индексами вместо предметов.

@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; 
} 
Смежные вопросы