Регистрация changelistener для группы узлов в javafx
Есть ли способ добавить список изменений в группу узлов для следующих изменений?
Например, мы можем добавить changelistener в tabpane для получения tabselectedproperty.
Я хочу добавить changelistener a в группу кнопок для получения buttonActionedProperty! Я хочу получить старую пуговицу и новую пуговицу....
Есть ли способ сделать это?
1 ответ:
Когда вы сравниваете вкладки на панели вкладок с набором кнопок, вы на самом деле не сравниваете "нравится" с "нравится". Панель вкладок, естественно, имеет представление о том, какая вкладка выбрана в данный момент; кнопки просто генерируют события, когда они нажимаются.
Если вы хотите, чтобы ваши кнопки имели состояние "выделено", и хотите, чтобы коллекция из них была сгруппирована так, чтобы был выбран только один, то рассмотрите возможность использования
ToggleButton
S вместо этого. Вы можете поместить кнопки переключения в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); } }