将changelistener注册到javafx中的节点组 [英] registering changelistener to group of nodes in javafx

查看:293
本文介绍了将changelistener注册到javafx中的节点组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法将changelistener添加到节点组以进行后续更改?



例如,我们可以在tabpane中添加一个changelistener来获取tabselectedproperty。 / p>

我想将changelistener a添加到一组按钮中以获取buttonActionedProperty!我想获得旧按钮和新按钮....



有没有办法做到这一点?

解决方案

当您将选项卡窗格中的选项卡与按钮集合进行比较时,您并没有真正比较喜欢。选项卡窗格自然地感知当前选择了哪个选项卡;按钮只是在按下时生成事件。



如果您希望按钮具有选定状态,并希望将这些按钮组合在一起以便只选择一个,那么请考虑使用 ToggleButton s 而不是。您可以将切换按钮放入 ToggleGroup 并使用切换组的 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;

公共类ToggleButtonDemo扩展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(选择切换从+ oldToggle +更改为+ newToggle) );

HBox root =新的HBox(5,苹果,橘子,梨);
root.setAlignment(Pos.CENTER);

场景场景=新场景(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;

公共类LastActionTrackingDemo扩展应用程序{

@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从+ oldButton +更改为+ newButton);

HBox root =新的HBox(5,苹果,橘子,梨);
root.setAlignment(Pos.CENTER);

场景场景=新场景(root,350,75);
primaryStage.setScene(scene);
primaryStage.show();
}

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

注意外观之间存在细微差别两个演示。第一个(带有切换按钮)可以直观地显示选择了哪个按钮。第二个没有。在这两种情况下,如果需要该功能,仍可以在按钮上设置动作侦听器。行为上也存在(不太微妙)的差异:切换按钮可以是未选择;因此,如果您按两次相同的切换按钮,则选择将返回null。按钮不会发生这种情况。


Is there any way to add a changelistener to group of nodes for following changes?

For example, we can add a changelistener to a tabpane for getting tabselectedproperty.

I want to add changelistener a to a group of buttons for getting buttonActionedProperty! I want to get old button and new button....

Is there any way to do this?

解决方案

When you compare the tabs in a tab pane to a collection of buttons, you're not really comparing like to like. A tab pane naturally has a sense of which tab is currently selected; buttons just generate events when they are pressed.

If you want your buttons to have a "selected" state, and want a collection of those grouped together so that only one is selected, then consider using ToggleButtons instead. You can put the toggle buttons into a ToggleGroup and register a listener with the toggle group's selectedToggle property:

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);
    }
}

If you really just want buttons, and don't have the notion of one of them being selected (I find it hard to see a use case for this), you can just create an ObjectProperty<Button> to store the last button on which an action occurred. Register an event listener with each button to update the property:

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);
    }
}

Note there is a subtle different between the appearance of the two demos. The first (with toggle buttons) has a visual representation of which button is selected. The second does not. In both cases you can still set action listeners on the buttons if you need that functionality. There is also a (less subtle) difference in behavior: the toggle buttons can be "unselected"; so if you press the same toggle button twice, the selection goes back to null. This doesn't happen with the buttons.

这篇关于将changelistener注册到javafx中的节点组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆