Привязка свойства размера массива к кнопке java fx - PullRequest
0 голосов
/ 23 сентября 2018

Предположим, у меня есть наблюдаемый список и кнопка в том же самом контроллере, что и у

private ObservableList<NameItem> _selectedList = _database.getONameList();

@FXML
private Button nextButton;

Как мне сделать так, чтобы только тогда, когда ObservableList больше 0, кнопка включена, иначе онавыключен?Есть ли свойство привязки, которое я могу использовать, чтобы установить это?

Я пытался использовать это: https://stackoverflow.com/a/38216335/5709876

Однако это не сработало для меня ..

1 Ответ

0 голосов
/ 23 сентября 2018

На самом деле это может быть сделано довольно просто с помощью пары простых привязок.

Во-первых, вы хотите создать IntegerBinding, который привязан к размеру вашего ObservableList:

IntegerBinding listSize = Bindings.size(_selectedList);

Затем создайте новый BooleanBinding, который будет привязан к тому, является ли привязка listSize больше 0:

BooleanBinding listPopulated = listSize.greaterThan(0);

Теперь все, что вам нужно сделать, это привязать кнопкуdisableProperty в противоположность свойству listPopulated с использованием метода not() (поскольку listPopulated будет true, если элементы в списке, вы на самом деле хотите передать false кнопке disableProperty):

button.disableProperty().bind(listPopulated.not());

Вот быстрый MCVE для демонстрации:

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
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.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) {

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

        // Create an empty ObservableList
        ObservableList<String> list = FXCollections.observableArrayList();

        // Create a binding to extract the list's size to a property
        IntegerBinding listSizeProperty = Bindings.size(list);

        // Create a boolean binding that will return true only if the list has 1 or more elements
        BooleanBinding listPopulatedProperty = listSizeProperty.greaterThan(0);

        // Create the button we want to enable/disable
        Button button = new Button("Submit");

        // Bind the button's disableProperty to the opposite of the listPopulateProperty
        // If listPopulateProperty is false, the button will be disabled, and vice versa
        button.disableProperty().bind(listPopulatedProperty.not());

        // Create another button to add an item to the list, just to demonstrate the concept
        Button btnAddItem = new Button("Add Item");
        btnAddItem.setOnAction(event -> {
            list.add("New Item");
            System.out.println(list.size());
        });

        // Add the buttons to the layout
        root.getChildren().addAll(btnAddItem, button);

        // Show the Stage
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

В приведенном выше примере кнопка «Отправить» отключена, пока вы не добавите элемент в ObservableList с помощью кнопки «Добавить элемент».

РЕДАКТИРОВАТЬ: Как Лукас превосходно указывает в комментариях ниже, эти привязки также могут быть объединены воедино для упрощения вещей (любой метод одинаково действителен; он просто зависит от того, что вы найдете большедействительно читабельно):

button.disableProperty().bind(Bindings.size(list).greaterThan(0).not())

Другой метод

Еще один способ сделать это - ListChangeListener, который позволяетили отключает кнопку каждый раз, когда меняется список:

    list.addListener((ListChangeListener<String>) c -> {
        // If the size of the list is less than 1, disable the button; otherwise enable it
        button.setDisable(c.getList().size() < 1);
    });

По сути, это будет делать то же самое, что и первый метод, но вам нужно будет установить начальное состояние кнопки самостоятельно, прежде чем слушатель сможетдержите его в актуальном состоянии.

...