Encuadernación etiqueta con contenido condicional?

Zephyr:

Tengo una Labelque necesita para mostrar el número de elementos en una ObservableList. Tengo la IntegerBindingconfiguración, pero también tengo que ajustar la redacción de la Labelbase de cuántos elementos hay en la lista.

Para el MCVE abajo, si sólo hay un elemento de la lista, se debe mostrar "La lista contiene 1 artículo." Pero "elemento" tiene que ser plural si la lista está vacía o contiene varios elementos: "La lista contiene 3 artículos."

He tratado de hacerlo utilizando tanto un operador ternario y una BooleanBinding, pero tampoco tiene ningún efecto como la expresión ternaria sólo parece ser evaluados una vez. Al hacer clic en el botón "Añadir" no cambia la parte de "elementos" de la Label.


EL CÓDIGO

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.IntegerBinding;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    ObservableList<String> items = FXCollections.observableArrayList();

    private IntegerBinding listSize = Bindings.size(items);

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // Simple Interface
        VBox root = new VBox(10);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(10));

        Label label = new Label();

        // Bind the label to display a size-aware notification
        label.textProperty().bind(
                Bindings.concat("The list contains ", listSize,
                        ((items.size() != 1) ? " items!" : " item!"))
        );

        // Button to add items
        Button button = new Button("Add");
        button.setOnAction(event -> items.add("new item"));

        root.getChildren().addAll(label, button);

        // Show the stage
        primaryStage.setScene(new Scene(root));
        primaryStage.setTitle("Sample");
        primaryStage.show();
    }
}


¿Es necesario incluir un detector para cuando el tamaño de la lista cambia?

JKostikiadis:

Aquí es una solución rápida utilizando un StringBinding personalizado ()

// Bind the label to display a size-aware notification
label.textProperty().bind(new StringBinding() {
    { bind(listSize); }

    @Override
    protected String computeValue() {
        return "The list contains " + listSize.get() + ((items.size() != 1) ? " items!" : " item!");
    }

});

En el código anterior se va a escuchar a la listSize para los cambios y luego va a crear la nueva cadena en el interior del computeValue ().

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=187622&siteId=1
Recomendado
Clasificación