Регистрация changelistener для группы узлов в javafx


Есть ли способ добавить список изменений в группу узлов для следующих изменений?

Например, мы можем добавить changelistener в tabpane для получения tabselectedproperty.

Я хочу добавить changelistener a в группу кнопок для получения buttonActionedProperty! Я хочу получить старую пуговицу и новую пуговицу....

Есть ли способ сделать это?

1 2

1 ответ:

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

Если вы хотите, чтобы ваши кнопки имели состояние "выделено", и хотите, чтобы коллекция из них была сгруппирована так, чтобы был выбран только один, то рассмотрите возможность использования ToggleButtonS вместо этого. Вы можете поместить кнопки переключения в ToggleGroup и зарегистрировать a слушатель со свойством группы переключателей selectedToggle:

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class ToggleButtonDemo extends Application {

    @Override
    public void start(Stage primaryStage) {
        ToggleButton apples = new ToggleButton("Apples");
        ToggleButton oranges = new ToggleButton("Oranges");
        ToggleButton pears = new ToggleButton("Pears");

        ToggleGroup fruitToggleGroup = new ToggleGroup();
        fruitToggleGroup.getToggles().addAll(apples, oranges, pears);

        fruitToggleGroup.selectedToggleProperty().addListener((obs, oldToggle, newToggle) -> 
                System.out.println("Selected toggle changed from "+oldToggle+" to "+newToggle));

        HBox root = new HBox(5, apples, oranges, pears);
        root.setAlignment(Pos.CENTER);

        Scene scene = new Scene(root, 350, 75);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Если вам действительно нужны кнопки, и у вас нет понятия о том, что одна из них выбрана (я затрудняюсь найти вариант использования для этого), вы можете просто создать ObjectProperty<Button>, чтобы сохранить последнюю кнопку, на которой произошло действие. Зарегистрируйте прослушиватель событий с каждой кнопкой, чтобы обновить свойство:

import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class LastActionTrackingDemo extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button apples = new Button("Apples");
        Button oranges = new Button("Oranges");
        Button pears = new Button("Pears");

        ObjectProperty<Button> lastActionedButton = new SimpleObjectProperty<>();

        EventHandler<ActionEvent> buttonActionHandler = event -> 
            lastActionedButton.set((Button) event.getSource());

        apples.addEventHandler(ActionEvent.ACTION, buttonActionHandler);
        oranges.addEventHandler(ActionEvent.ACTION, buttonActionHandler);
        pears.addEventHandler(ActionEvent.ACTION, buttonActionHandler);

        lastActionedButton.addListener((obs, oldButton, newButton) -> 
            System.out.println("Button changed from "+oldButton+" to "+newButton));

        HBox root = new HBox(5, apples, oranges, pears);
        root.setAlignment(Pos.CENTER);

        Scene scene = new Scene(root, 350, 75);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Обратите внимание, что есть тонкое различие между появлением двух демо. Первый (с кнопками переключения) имеет визуальный представление того, какая кнопка выбрана. Второй-нет. В обоих случаях вы все еще можете установить прослушиватели действий на кнопках, если вам нужна эта функциональность. Существует также (менее тонкая) разница в поведении: кнопки переключения могут быть "невыбранными"; поэтому, если вы дважды нажмете одну и ту же кнопку переключения, выбор возвращается к нулю. С кнопками такого не бывает.