Ich versuche, ein Verhalten der Benutzeroberfläche eines Akkordeons zu erhalten, in dem der Benutzer TitledPane
in ein Fenster herausspringen kann, und das Fenster zurück in eine TitledPane
innerhalb des Akkordeons.Popping TitledPane Inhalt ins Fenster
Wenn jedoch ein ausgeblendetes TitledPane
ausgeblendet wird, wird der Inhalt in Stage
nicht richtig ausgerichtet, und wenn das keine Fenster erweitert wird, wird es überhaupt nicht angezeigt.
Beigefügt ist ein minimales Beispiel, das das Problem zeigt - beachten Sie, dass ich zwei Platzhalterbereiche halten, um zu vermeiden, dass der Inhalt Knoten (A VBox
in meinem Fall) im Szenegraph mehr als einmal sein. Ich habe versucht, preferredSize
und visible
Eigenschaften auf der VBox
und auch layout
vor und nach dem Vorführen und sogar programmatisch erweitern die Titelscheibe, aber nichts scheint zu arbeiten.
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
TitledPane t1 = new TitledPane();
TitledPane t2 = new TitledPane();
Accordion accordion = new Accordion(t1, t2);
t1.setContent(buildComponent("Pane 1", t1, accordion));
t2.setContent(buildComponent("Pane 2", t2, accordion));
primaryStage.setScene(new Scene(accordion, 300, 300));
primaryStage.show();
}
private VBox buildComponent(String name, TitledPane titledPane, Accordion holder) {
final Button popout = new Button("Pop out");
titledPane.setGraphic(popout);
titledPane.setText(name);
final VBox component = new VBox(new Label(name), new TableView<>());
final Pane placeholder1 = new Pane();
final Pane placeholder2 = new Pane();
Stage st = new Stage();
st.setScene(new Scene(placeholder1, 300, 300));
popout.setOnAction(event -> {
if (!st.equals(component.getScene().getWindow())) {
holder.getPanes().remove(titledPane);
titledPane.setContent(placeholder2);
st.getScene().setRoot(component);
st.show();
}
});
st.setOnHidden(windowEvent -> {
st.getScene().setRoot(placeholder1);
titledPane.setContent(component);
holder.getPanes().add(titledPane);
});
return component;
}
public static void main(String[] args) {
launch(args);
}
}
Abbildungen der Ergebnisse:
Ergebnis, wenn keine Scheibe erweitert wird:
Ergebnis, wenn andere Scheibe erweitert wird. Beachten Sie, wie das Etikett nicht sichtbar ist:
Ergebnis, wenn Bereich erweitert wird - das ist das Ergebnis, das ich in allen Fällen haben will: