首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向JavaFX ToggleSwitch添加更改侦听器

向JavaFX ToggleSwitch添加更改侦听器
EN

Stack Overflow用户
提问于 2016-01-22 13:19:02
回答 1查看 3.5K关注 0票数 1

我的阶段包含一个ToggleSwitch和两个StackPanes,我们称之为A和B。两个StackPanes都位于父StackPane中的同一个空间中。这意味着,如果A和B都是可见的,并被设置为托管,则它们各自占用所分配空间的一半,如下所示:

我试图把StackPane B隐藏起来,以便StackPane A占据整个空间.然后,当我点击切换按钮时,它应该隐藏StackPane A并显示StackPane B,使B占据全部空间。

StackPane B的初始隐藏工作正常,但我在控制器类中为ToggleSwitch编写更改监听器时遇到了困难。这是我的代码,还有我遇到麻烦的地方:

应用程序类:

代码语言:javascript
复制
public class showPanes extends Application {
Stage stage = new Stage();
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws IOException {
        StackPane root = (StackPane) FXMLLoader.load(Drag.class.getResource("twoPanes.fxml"));
        Scene scene = new Scene(root);
        stage.setTitle("Pane Switcher");
        scene.getStylesheets().add("styleMain.css");
        stage.setScene(scene);
        stage.show();
    }
}

答案发现here使用Toggle组,James的答案here使用按钮。我找不到ToggleSwitch的解决方案。我尝试将第一个答案修改为ToggleSwitch,但是它产生了一个错误,例如:

并说

无法解析方法‘addListener(匿名javafx.beans.value.ChangeListener)’

我该如何修复听者?

控制器类:

代码语言:javascript
复制
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.layout.StackPane;
import java.net.URL;
import java.util.ResourceBundle;
import org.controlsfx.control.ToggleSwitch;

public class compsController implements Initializable {
    @FXML
    private StackPane paneA, paneB;

    @FXML
    private ToggleSwitch toggleSwitch;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        paneB.setManaged(false);
        paneB.setVisible(false);

        toggleSwitch.selectedProperty().addListener(new ChangeListener < ToggleSwitch > () {
            @Override
            public void changed(ObservableValue < ? extends ToggleSwitch > ov, ToggleSwitch t, ToggleSwitch t1) {
                paneA.setManaged(false);
                paneA.setVisible(false);
                paneB.setManaged(true);
                paneB.setVisible(true);
            }
        });
    }
}
EN

回答 1

Stack Overflow用户

发布于 2017-06-10 10:08:30

您还可以使用JavaFx的绑定API,如下所示,

代码语言:javascript
复制
@Override
public void initialize(URL location, ResourceBundle resources) {
    paneA.managedProperty().bind(toggleSwitch.selectedProperty());
    paneA.visibleProperty().bind(toggleSwitch.selectedProperty());
    paneB.managedProperty().bind(toggleSwitch.selectedProperty().not());
    paneB.visibleProperty().bind(toggleSwitch.selectedProperty().not());
}

}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34947685

复制
相关文章

相似问题

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