У меня есть 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();
}
}
Нужно ли включать прослушиватель при изменении размера списка?