有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将changelistener注册到javafx中的节点组

是否有任何方法将changelistener添加到节点组以进行以下更改

例如,我们可以将changelistener添加到tabpane以获取tabselectedproperty

我想将changelistener a添加到一组按钮中,以获取buttonActionedProperty!我想买旧的和新的钮扣

有没有办法做到这一点


共 (1) 个答案

  1. # 1 楼答案

    当您将选项卡窗格中的选项卡与一组按钮进行比较时,您并不是真正地比较喜欢。选项卡窗格自然会知道当前选择了哪个选项卡;按钮按下时只生成事件

    如果你想让你的按钮有一个“被选择”的状态,并且想要一组被组合在一起,所以只选择一个,然后考虑使用^ a1}。您可以将切换按钮放入^{}中,并使用切换组的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);
        }
    }
    

    请注意,这两个演示的外观有细微的不同。第一个(带有切换按钮)具有所选按钮的视觉表示。第二种情况并非如此。在这两种情况下,如果需要该功能,您仍然可以在按钮上设置动作侦听器。在行为上还有一个(不那么微妙的)区别:切换按钮可以是“未选择的”;因此,如果按两次相同的切换按钮,选择将返回null。按钮不会发生这种情况