【问题标题】:Adding a change listener to JavaFX ToggleSwitch向 JavaFX ToggleSwitch 添加更改侦听器
【发布时间】:2016-01-22 13:19:02
【问题描述】:

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

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

StackPane B 的初始隐藏工作正常,但我在控制器类中为 ToggleSwitch 编写更改侦听器时遇到问题。这是我的代码,我遇到了麻烦:

应用类:

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 使用切换组,詹姆斯的答案here 使用按钮。我找不到ToggleSwitch 的解决方案。我试图调整第一个答案以与ToggleSwitch 一起使用,但它会产生如下错误:

然后说

无法解析方法'addListener(anonymous javafx.beans.value.ChangeListener)'

如何修复监听器?

控制器类:

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

【问题讨论】:

  • ToggleSwitch.selectedProperty() 返回 BooleanProperty,而不是 Property&lt;ToggleSwitch&gt;
  • 谢谢詹姆斯,我认为那是错误的,但我很困惑应该用什么替换它。您提供的链接显示了有限的替代方案。我尝试改用fire,但错误仍然存​​在。有什么提示吗?? ://
  • 所以你需要ChangeListener&lt;Boolean&gt;,而不是ChangeListener&lt;ToggleSwitch&gt;
  • 是的,做到了。谢谢。

标签: java javafx event-handling changelistener toggleswitch


【解决方案1】:

您也可以使用 JavaFx 的 Binding API,如下所示,

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

}

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2016-04-19
    • 2019-06-04
    • 2014-01-30
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多