单选按钮更改事件 JavaFx

3
我有很多HBoxes,里面有一些不同的组件(RadioButton、Label、Button等)。 这些RadioButtons在一个ToggleGroup中,因此只能选择一个单选按钮。
我想为Radio Button添加OnChange事件。如果取消选择RadioButton,则应触发事件。如何向Radio-Button添加事件?
目前我的代码类似于以下示例,但它没有我想要的功能。
radio.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent arg0) {
            if(!radio.isSelected()){
                ivTriangleImg.setRotate(iRotateCoord2);
                btnTriangle.setGraphic(ivTriangleImg);
            }

            if(group!=null){
                group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {

                    @Override
                    public void changed(
                            ObservableValue<? extends Toggle> arg0,
                            Toggle arg1, Toggle arg2) {

                    }
                });
            }
        }
    });

我使用的是JavaFX 2.0和Java 1.7,因此无法使用Lambda函数或JavaFx8 / Java 1.8的特殊组件函数。


group=Toggle Group 当单选按钮未被选中时,我想获取相关信息... - Lukas Hieronimus Adler
3个回答

7
JavaFX控件的状态由可观察属性表示。您可以使用control.propertyNameProperty()访问这些属性,并向其添加add ChangeListeners
radioButton.selectedProperty().addListener(new ChangeListener<Boolean>() {
    @Override
    public void changed(ObservableValue<? extends Boolean> obs, Boolean wasPreviouslySelected, Boolean isNowSelected) {
        if (isNowSelected) { 
            // ...
        } else {
            // ...
        }
    }
});

3
radio.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent arg0) {
            if(!radio.isSelected()){
                ivTriangleImg.setRotate(iRotateCoord2);
                btnTriangle.setGraphic(ivTriangleImg);
            }

            if(group!=null){
                group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {

                    @Override
                    public void changed(
                            ObservableValue<? extends Toggle> arg0,
                            Toggle arg1, Toggle arg2) {

                        if(!radio.isSelected()&&ivTriangleImg.getRotate()!=iRotateCoord1){
                            ivTriangleImg.setRotate(iRotateCoord1);
                            btnTriangle.setGraphic(ivTriangleImg);
                        }

                    }
                });
            }
        }
    });

这对我的问题有用。我犯了一个小错误,没有检查单选按钮的样式。现在它运行得很好......对不起这个问题。

有可能仅检查单选按钮上的事件而不是其所在组的事件吗?


已经很久了 :) 但是:不太理解底部加粗的文本 - 它是另一个问题还是对原始问题的另一种表述?无论如何,你所做的似乎是基于选择状态旋转图形。如果是这样的话,CSS或绑定可能是另一种方法。 - kleopatra

-1
如果您有许多单选按钮,您不想为每个单选按钮都设置一个事件处理程序...
这里有一个例子,有6个单选按钮,但只有一个ChangeListener,所有事件都在一个集中的方法中处理。
这可以检测编程事件、键盘事件和鼠标事件。
请注意,监听器被添加到ToggleGroup中。
public class ReportOptionsPane extends BorderPane implements ChangeListener<Toggle> {
    RadioButton radioFoldersOnly ;
    RadioButton radioAllItems ;
    RadioButton radioArtifactsOnly  ;
    RadioButton radioStatsOrderByOccurrence  ;
    RadioButton radioStatsOrderByName  ;

    public ReportOptionsPane(ReportOptions rep)  {
        super() ;
        ToggleGroup tg = new ToggleGroup();
        radioFoldersOnly = new RadioButton("Folders only") ;
        radioAllItems = new RadioButton("Files & Folders") ;
        radioArtifactsOnly = new RadioButton("Artifacts only") ;

        radioFoldersOnly.setToggleGroup(tg);
        radioAllItems.setToggleGroup(tg);
        radioArtifactsOnly.setToggleGroup(tg);

        //You add the listener to the toogle group of your radio buttons
        tg.selectedToggleProperty().addListener(this);

        ToggleGroup tg2 = new ToggleGroup();
        radioStatsOrderByOccurrence = new RadioButton("Order stats by occurrence") ;
        radioStatsOrderByName = new RadioButton("Order stats by name") ;

        radioStatsOrderByOccurrence.setToggleGroup(tg2);
        radioStatsOrderByName.setToggleGroup(tg2);

        //You can reuse the listener for the second toogle group of your radio buttons
        tg2.selectedToggleProperty().addListener(this);
    }

    //Then you handle all in a centralized place 
    @Override
    public void changed(ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) {
        if(newValue.equals(radioFoldersOnly)) {
            //react to radio button being selected
        } else if(newValue.equals(radioAllItems)) {
            //react to radio button being selected
        } else if(newValue.equals(radioArtifactsOnly)) {
            //react to radio button being selected
        } else if(newValue.equals(radioStatsOrderByName)) {
            //react to radio button being selected
        } else if(newValue.equals(radioStatsOrderByOccurrence)  {
            //react to radio button being selected
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接