Добавление прослушивателя изменений в JavaFX ToggleSwitch

Моя сцена содержит ToggleSwitch и два StackPanes, которые мы назовем A и B. Обе панели стека расположены в одном и том же пространстве внутри родительского 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();
    }
}

Ответ, найденный здесь, использует группы переключения, а ответ Джеймса здесь используются кнопки. Я не могу найти решение для ToggleSwitch. Я попытался адаптировать первый ответ для использования с ToggleSwitch, но он выдает ошибку, например:

введите здесь описание изображения

и говорит

Не удается разрешить метод «addListener (анонимный 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);
            }
        });
    }
}

person Mathomatic    schedule 22.01.2016    source источник
comment
ToggleSwitch.selectedProperty() возвращает BooleanProperty, а не Property<ToggleSwitch>.   -  person James_D    schedule 22.01.2016
comment
Спасибо, Джеймс, я понял, что это неправильно, но я не понимаю, чем его следует заменить. Предоставленная вами ссылка показывает ограниченные альтернативы. Вместо этого я попытался использовать fire, но ошибка остается. Есть подсказки?? :/   -  person Mathomatic    schedule 22.01.2016
comment
Так что вам нужен ChangeListener<Boolean>, а не ChangeListener<ToggleSwitch>.   -  person James_D    schedule 22.01.2016
comment
Да, это сделало это. Спасибо.   -  person Mathomatic    schedule 22.01.2016


Ответы (1)


Вы также можете использовать Binding API JavaFx, как показано ниже:

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

}

person George Siggouroglou    schedule 10.06.2017