llenar data java javafx-2 javafx tableview

llenar - tableview javafx add data



ActualizaciĆ³n de la apariencia de la fila TableView (3)

Debe establecer el tachado en la clase .text: ;-)

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

Tengo algunas dificultades para cambiar la apariencia de algunas filas de TableView. La línea debe mostrar el texto con un trazo y en rojo. En realidad, puedo mostrarlo en color rojo pero todavía no puedo hacer el trazo. Esta es la clase css que estoy usando para cambiar el aspecto de la línea:

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

Esta clase de estilo se agrega cuando el usuario marca el elemento como cancelado:

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"); } }; } }

Hay otro problema aquí, la fila marcada como cancelada solo cambia el color cuando el usuario agrega o elimina un elemento de la lista observable. ¿Hay alguna manera de forzar la actualización de TableView?

INFORMACIÓN EDITADA

Cambié la clase ItemBean para usar BooleanProperty y se resolvió parcialmente:

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; } }

Desafortunadamente, solo la columna "cancelado" (que será escondida o eliminada cuando esto finalmente funcione) cambia la apariencia:

Aquí configuro las columnas y la tabla:

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); } ... }

¿Cómo puedo actualizar todas las columnas?


¿Cómo puedo actualizar todas las columnas? Si desea tachar toda la fila, es decir, todas las celdas en una fila, cada otra CellValueFactory debe tener esa verificación de condición:

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

O podría implementar sus devoluciones de llamadas como decoradores y tener algo como esto:

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())); ....

De esta forma, no tiene que repetir el código de estilo "cancelado" y puede aplicarlo a toda la fila. Tenga en cuenta que este no es un código listo para JavaFX, esta es una idea general.


¿Hay alguna manera de forzar la actualización de TableView?

Haga que el Cancelado una propiedad de la clase ItemBean :

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

Ahora la implementación de celda predeterminada para la vista de lista escuchará los cambios en la propiedad cancelado y activará updateItem llamadas a updateItem para la celda de vista de lista relevante según corresponda.

Tenga en cuenta que el nombre de la función que devuelve la propiedad es importante, debe ser canceladoProperty() ya que JavaFX amplía el patrón getter y el patrón setter de Java Beans para las propiedades.

Naming Property Convention Background

La convención de nomenclatura para el acceso a la propiedad JavaFX se muestra en este fragmento de código del tutorial de 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;} }

Existe una gran descripción general de la arquitectura de propiedades de JavaFX en la wiki de openfx que detalla las convenciones de nombres para las propiedades y varios escenarios de uso más avanzados, como las propiedades de solo lectura y las propiedades diferidas.

Personalizar la apariencia de una fila en una TableView

En este código de muestra esencial se proporciona información adicional y un ejemplo de personalización de la apariencia de la fila de la tabla en función de un valor de fila booleana.

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); }

Relacionado

La pregunta de ¿ Antecedentes con 2 colores en JavaFX? , proporciona una solución similar. La discusión en la respuesta a esa pregunta proporciona más información sobre salvedades y sutilezas del resaltado de filas de tablas en JavaFX (básicamente, es realmente difícil obtener los estilos de clase psuedo - anillos de enfoque, barras seleccionadas, comentarios de desplazamiento, etc. - a la derecha con filas personalizadas estilos).