2013-04-22 9 views
13

Mam pewne trudności, aby zmienić wygląd niektórych wierszy TableView. Linia powinna pokazywać tekst z obrysem i na czerwono. Właściwie mogę pokazać to w kolorze czerwonym, ale nadal nie mogę wykonać skoku. Jest to klasa css używam do zmiany wyglądu linii:Aktualizacja wyglądu wiersza TableView

.itemCancelado { 
    -fx-strikethrough: true; 
    -fx-text-fill: red; 
} 

Ta klasa styl dodaje gdy użytkownik oznaczyć przedmiot jako anulowane:

public class ItemCanceladoCellFactory implements Callback<TableColumn, TableCell> { 
    @Override 
    public TableCell call(TableColumn tableColumn) { 
     return new TableCell<ItemBean, Object>() { 
      @Override 
      public void updateItem(Object item, boolean empty) { 
       super.updateItem(item, empty); 
       setText(empty ? "" : getItem().toString()); 
       setGraphic(null); 
       int indice=getIndex(); 
       ItemBean bean=null; 
       if(indice<getTableView().getItems().size()) 
        bean = getTableView().getItems().get(indice); 
       if (bean != null && bean.isCancelado()) 
        getStyleClass().add("itemCancelado"); 
      } 
     }; 
    } 
} 

jest jeszcze inny problem tutaj , wiersz oznaczony jako anulowany zmienia tylko kolor, gdy użytkownik dodaje lub usuwa element z obserwowalnej listy. Czy istnieje sposób, w jaki mogę wymusić aktualizację TableView?

INFORMACJE EDYCJI

Zmieniłem ItemBean klasę używać BooleanProperty i rozwiązał częściowo:

public class ItemBean { 
    ... 
    private BooleanProperty cancelado = new SimpleBooleanProperty(false); 
    ... 
    public Boolean getCancelado() { 
     return cancelado.get(); 
    } 

    public void setCancelado(Boolean cancelado){ 
     this.cancelado.set(cancelado); 
    } 

    public BooleanProperty canceladoProperty(){ 
     return cancelado; 
    } 
} 

Niestety, tylko kolumna „cancelado” (które będą hided lub usunięte, gdy ta wreszcie działać) zmienia wygląd:

cancelado column changes the appearance

tutaj skonfigurować kolumn i tabela:

public class ControladorPainelPreVenda extends ControladorPainel { 

    @FXML 
    private TableView<ItemBean> tabelaItens; 
    private ObservableList<ItemBean> itens = FXCollections.observableArrayList(); 
    ... 

    private void configurarTabela() { 
     colunaCodigo.setCellValueFactory(new MultiPropertyValueFactory<ItemBean, String>("produto.id")); 
     colunaCodigo.setCellFactory(new ItemCanceladoCellFactory()); 
     colunaDescricao.setCellValueFactory(new MultiPropertyValueFactory<ItemBean, String>("produto.descricao")); 
     colunaDescricao.setCellFactory(new ItemCanceladoCellFactory()); 
     colunaLinha.setCellValueFactory(new MultiPropertyValueFactory<ItemBean, String>("produto.nomeLinha")); 
     colunaLinha.setCellFactory(new ItemCanceladoCellFactory()); 
     colunaQuantidade.setCellValueFactory(new PropertyValueFactory<ItemBean, BigDecimal>("quantidade")); 
     colunaQuantidade.setCellFactory(new ItemCanceladoCellFactory()); 
     colunaValorLiquido.setCellValueFactory(new PropertyValueFactory<ItemBean, BigDecimal>("valorLiquido")); 
     colunaValorLiquido.setCellFactory(new ItemCanceladoCellFactory()); 
     colunaValorTotal.setCellValueFactory(new PropertyValueFactory<ItemBean, BigDecimal>("valorTotal")); 
     colunaValorTotal.setCellFactory(new ItemCanceladoCellFactory()); 
     colunaCancelado.setCellValueFactory(new PropertyValueFactory<ItemBean, Boolean>("cancelado")); 
     colunaCancelado.setCellFactory(new ItemCanceladoCellFactory()); 
     tabelaItens.setItems(itens); 
    } 
    ... 
} 

Jak mogę zaktualizować wszystkie kolumny?

Odpowiedz

9

Czy istnieje sposób można wymusić aktualizację Tableview?

Dokonać Cancelado właściwość klasy ItemBean:

private BooleanProperty cancelado = new SimpleBooleanProperty(false); 
public BooleanProperty canceladoProperty() { 
    return cancelado; 
} 

Teraz domyślna implementacja komórka do widoku listy będą słuchać zmian na nieruchomości cancelado i wywołać updateItem zaproszenia do odpowiedniej komórki listy Zobacz w formie właściwy.

Należy pamiętać, że nazwa funkcji, która zwraca właściwość jest ważna, musi być canceladoProperty(), ponieważ program JavaFX rozszerza standardowy element pobierający element i model selektora Java Beans dla właściwości.

Property Naming Convention tle

Konwencja nazewnictwa dla JavaFX dostępu nieruchomość jest wykazać w tym fragmencie kodu z samouczka Oracle Using JavaFX Properties and Binding.

package propertydemo; 

import javafx.beans.property.DoubleProperty; 
import javafx.beans.property.SimpleDoubleProperty; 

class Bill { 

    // Define a variable to store the property 
    private DoubleProperty amountDue = new SimpleDoubleProperty(); 

    // Define a getter for the property's value 
    public final double getAmountDue(){return amountDue.get();} 

    // Define a setter for the property's value 
    public final void setAmountDue(double value){amountDue.set(value);} 

    // Define a getter for the property itself 
    public DoubleProperty amountDueProperty() {return amountDue;} 

} 

Istnieje wielka przegląd JavaFX Property Architecture na wiki OpenFX który zawiera szczegółowy opis konwencji nazewnictwa dla właściwości i różnych scenariuszy użycia bardziej zaawansowanych, jak tylko do odczytu właściwości i właściwości leniwych.

Dostosowywanie wyglądu wiersza w tableview

dodatkowych wojsk informacji oraz przykładowe dostosowywania wyglądu tabeli wiersza w oparciu o wartość logiczną rzędzie jest w tym gist sample code.

private TableColumn<Friend, Boolean> makeBooleanColumn(String columnName, String propertyName, int prefWidth) { 
    TableColumn<Friend, Boolean> column = new TableColumn<>(columnName); 
    column.setCellValueFactory(new PropertyValueFactory<Friend, Boolean>(propertyName)); 
    column.setCellFactory(new Callback<TableColumn<Friend, Boolean>, TableCell<Friend, Boolean>>() { 
    @Override public TableCell<Friend, Boolean> call(TableColumn<Friend, Boolean> soCalledFriendBooleanTableColumn) { 
     return new TableCell<Friend, Boolean>() { 
     @Override public void updateItem(final Boolean item, final boolean empty) { 
      super.updateItem(item, empty); 

      // clear any custom styles 
      this.getStyleClass().remove("willPayCell"); 
      this.getStyleClass().remove("wontPayCell"); 
      this.getTableRow().getStyleClass().remove("willPayRow"); 
      this.getTableRow().getStyleClass().remove("wontPayRow"); 

      // update the item and set a custom style if necessary 
      if (item != null) { 
      setText(item.toString()); 
      this.getStyleClass().add(item ? "willPayCell" : "wontPayCell"); 
      this.getTableRow().getStyleClass().add(item ? "willPayRow" : "wontPayRow"); 
      } 
     } 
     }; 
    } 
    }); 
    column.setPrefWidth(prefWidth); 
} 

pokrewne

StackOverflow pytanie Background with 2 colors in JavaFX? przewiduje podobnego rozwiązania. Dyskusja w odpowiedzi na to pytanie dostarcza dalszych informacji o zastrzeżeniach i subtelnościach podświetlania wierszy tabeli w JavaFX (w zasadzie bardzo ciężko jest uzyskać style klasy psuedo - pierścienie ostrości, wybrane paski, sprzężenie zwrotne na hover itp. - w prawo z niestandardowym wierszem style).

+0

Zrobiłem to, co powiedziałeś, ale TableView wciąż nie aktualizuje się. – brevleq

+0

Musisz nazwać metodę, która pobiera właściwość 'cancelado'' canceladoProperty() 'jak w moim przykładzie nie' getCancelado() 'jak w dodanej informacji w twoim pytaniu. – jewelsea

+0

Rozwiązane częściowo, jak widać w edytowanym pytaniu :) – brevleq

5

Musisz ustawić przekreślenia do .text klasy: ;-)

.itemCancelado { 
    -fx-text-fill: red; 
} 
.itemCancelado .text { 
    -fx-strikethrough: true; 
} 
+0

Rozwiązany problem strajku, ale nadal mam problemy z aktualizacją TableView – brevleq

3

Jak mogę zaktualizować wszystkie kolumny? Jeśli chcesz uderzyć out cały wiersz, czyli wszystkie komórki w wierszu, co drugi CellValueFactory powinien mieć ten czek Stan:

... 
    if (indice < getTableView().getItems().size()) 
     bean = getTableView().getItems().get(indice); 
    if (bean != null && bean.isCancelado()) 
     getStyleClass().add("itemCancelado"); 
    ... 

Albo można wdrożyć swoje zwrotnych jako decorators i mieć coś takiego:

public class CellDecorator implements Callback<TableColumn, TableCell> { 
    private Callback<TableColumn, TableCell> decorated; 

    public CellDecorator(Callback<TableColumn, TableCell> toDecorate) { 
     this.decorated = toDecorate; 
    } 

    // Override this to do your thing. 
    public abstract void doStyle(TableCell tableCell); 

    @Override 
    public void style(TableCell tableCell) { 
     // Let the decorated styler do its thing. 
     decorated.style(tableCell); 

     // Now we do our thing. 
     doStyle(cell); 
    } 
} 

public class ItemCanceladoCellFactory extends CellDecorator { 
    public ItemCanceladoCellFactory(Callback<TableColumn, TableCell> toDecorate) { 
     super(toDecorate); 
    } 

    @Override 
    public void doStyle(TableCell tableCell) { 
     ... 
     if (bean != null && bean.isCancelado()) 
      getStyleClass().add("itemCancelado"); 
    } 
} 

... 
colunaCodigo.setCellValueFactory(new ItemCanceladoCellFactory(new MultiPropertyValueFactory<ItemBean, String>("produto.id"))); 
colunaDescricao.setCellValueFactory(new ItemCanceladoCellFactory(new MultiPropertyValueFactory<ItemBean, String>("produto.descricao"))); 
colunaDescricao.setCellFactory(new ItemCanceladoCellFactory(new ItemCanceladoCellFactory())); 
.... 

w ten sposób nie trzeba powtarzać „anulowany” kod stylizacji i można ją zastosować do całego wiersza. Proszę uwaga, że nie jest to kod JavaFX gotowy, jest to ogólny pomysł.

Powiązane problemy