1

私のステージには、A と B と呼ぶ aToggleSwitchと 2 つが含まれてStackPanesいます。両方の StackPanes は、parent 内の同じスペースにあります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();
    }
}

ここで見つかった回答は Toggle Groups を使用しており、James の回答はここでButtons を使用しています。の解決策が見つかりません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);
            }
        });
    }
}
4

1 に答える 1

2

以下のように 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());
}

}

于 2017-06-10T10:08:30.593 に答える