首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在javafx中双向绑定ToggleGroup

在javafx中双向绑定ToggleGroup
EN

Stack Overflow用户
提问于 2014-04-25 21:09:09
回答 4查看 6.2K关注 0票数 8

想象一下有一个定义鼠标模式的枚举:

代码语言:javascript
运行
复制
public enum MouseMode {
SELECTION,
EDITING,
DELETING }

想象一下,一个由3个按钮组成的切换组:

代码语言:javascript
运行
复制
    ToggleButton selection = new ToggleButton("Select");
    ToggleButton editing = new ToggleButton("Edit");
    ToggleButton deleting = new ToggleButton("Delete");
    ToggleGroup mouseSelection = new ToggleGroup();

我希望字段MouseMode currentMode是双向链接到切换组。无论何时设置切换,currentMode都会相应地切换,但如果某些外部进程更改了currentMode (可能是按键),则切换组将相应地进行调整。

我可以用两个侦听器来完成这个任务,但是我想知道是否有一种方法可以创建一个自定义的双向映射。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-26 22:50:15

我不认为有办法直接做到这一点。而一般的目的

代码语言:javascript
运行
复制
Bindings.bindBidirectional(Property<S> property1, Property<T> property2, Function<S,T> mapping, Function<T,S> inverseMapping)

这可能是对API的一个很好的补充,即使在这种情况下也没有帮助,因为ToggleGroupselectedProperty是只读的(因为每个TogglesetSelected(...)方法调用时以及ToggleGroupselectedProperty都需要处理选择)。

在这种情况下,使用几个侦听器是可行的。

与“自定义双向映射”最接近的是

代码语言:javascript
运行
复制
Bindings.bindBiDirectional(StringProperty stringProperty, ObjectProperty<T> otherProperty, StringConverter<T> converter)

方法。在有(可写) ObjectProperty<S>和(可写) ObjectProperty<T>的情况下,理论上可以使用两个双向绑定和一个中间StringProperty将它们绑定在一起。在实践中,这几乎总是比仅仅使用两个侦听器更多的代码,而且效率也较低。

票数 8
EN

Stack Overflow用户

发布于 2014-07-31 14:27:46

我已经成功地在ToggleGroupValue项目中使用了JFXtras类。

下面是一个示例:

代码语言:javascript
运行
复制
import java.util.Arrays;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class Main extends Application {
    Child myChild = new Child();
    @Override
    public void start( Stage stage ) throws Exception {
        stage.setTitle( "ToggleGroupValue Example" );
        GridPane gridPane = new GridPane();
        int rowIndex = 0;
        gridPane.add( new Label("Nickname: "), 0, rowIndex );
        
        ToggleGroupValue toggleGroupValue = new ToggleGroupValue();
        rowIndex = createAddRadioButtons( gridPane, rowIndex, toggleGroupValue );
        
        gridPane.add( new Label("Selected Nickname: "), 0, rowIndex );
        Label selectedNickNameValueLabel = new Label();
        gridPane.add( selectedNickNameValueLabel, 1, rowIndex );
        
        myChild.nicknameProperty().bindBidirectional( toggleGroupValue.valueProperty() );
        selectedNickNameValueLabel.textProperty().bind( toggleGroupValue.valueProperty() );
        
        stage.setScene( new Scene( gridPane, 300, 100 ) );
        stage.show();
    }

    private int createAddRadioButtons( GridPane gridPane, int rowIndex, ToggleGroupValue toggleGroupValue ) {
        RadioButton radioButtonPunkin = new RadioButton();
        radioButtonPunkin.setUserData( "Punkin" );
        RadioButton radioButtonLittleBoy = new RadioButton();
        radioButtonLittleBoy.setUserData( "Little Boy" );
        RadioButton radioButtonBuddy = new RadioButton();
        radioButtonBuddy.setUserData( "Buddy" );
        List<RadioButton> radioButtons = Arrays.asList( radioButtonPunkin, radioButtonLittleBoy, radioButtonBuddy );
        for ( RadioButton radioButton : radioButtons ) {
            toggleGroupValue.add( radioButton, radioButton.getUserData() );
            radioButton.setText( radioButton.getUserData().toString() );
            gridPane.add( radioButton, 1, rowIndex++ );
        }
        return rowIndex;
    }

    private static class Child {
        private StringProperty nickname = new SimpleStringProperty();
        public StringProperty nicknameProperty() {
            return nickname;
        }
        public String getNickname() {
            return nickname.get();
        }
        public void setNickname( String notesProperty ) {
            this.nickname.set( notesProperty );
        }
    }

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

票数 3
EN

Stack Overflow用户

发布于 2017-04-03 15:27:25

我正在使用Java属性适配器,但是您可以使用这段代码的最后一行并绑定它。

代码语言:javascript
运行
复制
JavaBeanObjectProperty<fooEnum> property = null;
    try {
        property = new JavaBeanObjectPropertyBuilder<fooEnum>().bean(fooBean).name(fooField).build();
    } catch (NoSuchMethodException e1) {
        e1.printStackTrace();
    }
    property.addListener((obs, oldValue, newValue) -> {
        System.out.println("Property value changed from " + oldValue + " to " + newValue);
    });
BindingUtils.bindToggleGroupToProperty(fooToggleGroup, property);

您需要有一个用于BindingUtils的小型ToggleGroup类。

代码语言:javascript
运行
复制
public final class BindingUtils {

private BindingUtils() {
}

public static <T> void bindToggleGroupToProperty(final ToggleGroup toggleGroup, final ObjectProperty<T> property) {
    // Check all toggles for required user data
    toggleGroup.getToggles().forEach(toggle -> {
        if (toggle.getUserData() == null) {
            throw new IllegalArgumentException("The ToggleGroup contains at least one Toggle without user data!");
        }
    });
    // Select initial toggle for current property state
    for (Toggle toggle : toggleGroup.getToggles()) {
        if (property.getValue() != null && property.getValue().equals(toggle.getUserData())) {
            toggleGroup.selectToggle(toggle);
            break;
        }
    }
    // Update property value on toggle selection changes
    toggleGroup.selectedToggleProperty().addListener((observable, oldValue, newValue) -> {
        property.setValue((T) newValue.getUserData());
    });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23303087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档