2016-06-27 5 views
0

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:
Result when no pane is expanded
Ergebnis, wenn andere Scheibe erweitert wird. Beachten Sie, wie das Etikett nicht sichtbar ist:
Result when other pane is expanded. Note how the label is not visible.
Ergebnis, wenn Bereich erweitert wird - das ist das Ergebnis, das ich in allen Fällen haben will:
Result when pane is expanded - this is the result I want to have in all cases.

Antwort

0

Nach etwas mehr herumgespielt habe ich einen Weg gefunden, umgehen dieses Problem, indem AnchorPane s anstelle von direkt die Stage 's Wurzel und der TitledPane' s Inhalt Einstellung:

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 AnchorPane placeholder1 = new AnchorPane(); 
    final AnchorPane placeholder2 = new AnchorPane(); 
    AnchorPane.setTopAnchor(component, 0D); 
    AnchorPane.setBottomAnchor(component, 0D); 
    AnchorPane.setLeftAnchor(component, 0D); 
    AnchorPane.setRightAnchor(component, 0D); 
    Stage st = new Stage(); 
    st.setScene(new Scene(placeholder1, 300, 300)); 
    titledPane.setContent(placeholder2); 
    placeholder2.getChildren().add(component); 

    popout.setOnAction(event -> { 
     if (!st.equals(component.getScene().getWindow())) { 
      holder.getPanes().remove(titledPane); 
      placeholder2.getChildren().clear(); 
      placeholder1.getChildren().add(component); 
      st.show(); 
     } 
    }); 

    st.setOnHidden(windowEvent -> { 
     placeholder1.getChildren().clear(); 
     placeholder2.getChildren().add(component); 
     holder.getPanes().add(titledPane); 
    }); 

    return component; 
} 

Diese neue buildComponent fügt auch die VBox t o die TitledPane, so sollte der Anruf an TitledPane#setContent in der Frage entfernt werden.

Ich bin immer noch interessiert zu wissen, warum dieses Problem auftritt, oder wenn es eine Möglichkeit gibt, es zu lösen, ohne mein Fenster mit einem anderen Fenster (AnchorPane in meinem Fall).

Verwandte Themen