На самом деле это может быть сделано довольно просто с помощью пары простых привязок.
Во-первых, вы хотите создать 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);
});
По сути, это будет делать то же самое, что и первый метод, но вам нужно будет установить начальное состояние кнопки самостоятельно, прежде чем слушатель сможетдержите его в актуальном состоянии.