Обязательный ярлык с условным содержанием? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть Label, который должен отображать количество элементов в ObservableList.У меня есть настройка IntegerBinding, но мне также нужно настроить формулировку Label в зависимости от количества элементов в списке.

Для MCVE ниже, если вв списке должно отображаться «Список содержит 1 элемент».Но «элемент» должен быть множественным, если список пуст или содержит несколько элементов: «Список содержит 3 элемента».

Я пытался сделать это, используя как троичный оператор, так и BooleanBinding, нони один из них не имеет никакого эффекта, поскольку троичное выражение, кажется, оценивается только один раз.Нажатие кнопки «Добавить» не приводит к изменению части «элементы» Label.


КОД

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


Нужно ли включать прослушиватель при изменении размера списка?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Это более короткий эквивалент:

label.textProperty().bind(Bindings.createStringBinding(
                              () -> "The list contains " + listSize.get() + ((itemSize.get() != 1) ? " items!" : " item!",
                              listSize
                          ));

Или другой вариант:

label.textProperty.bind(Bindings
                           .when(listSize.isEqualTo(1))
                           .then("The list contains 1 item!")
                           .otherwise(
                               Bindings.concat("The list contains " + listSize + " items!")
                           )
                       );
0 голосов
/ 08 октября 2018

Вот быстрое решение с использованием пользовательского StringBinding ()

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

});

В приведенном выше коде вы прослушаете listSize для изменений, а затем создадите новую String внутри computeValue ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...