有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java向JavaFX ToggleSwitch添加更改侦听器

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

enter image description here

我试图在初始化时隐藏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使用切换组,而James的答案here使用按钮。我找不到ToggleSwitch的解决方案。我尝试将第一个答案改编为与ToggleSwitch一起使用,但它产生了如下错误:

enter image description here

Cannot resolve method '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);
            }
        });
    }
}

共 (1) 个答案

  1. # 1 楼答案

    您也可以使用JavaFx的绑定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());
    }
    

    }