2016-03-29 14 views
2

Ich möchte den Teiler einer SplitPane auf eine bestimmte Standardposition setzen. Das funktioniert nicht, die Teiler Aufenthalte in der Mitte:Teilerposition von SplitPane einstellen

public void start(Stage primaryStage) throws Exception{ 

    SplitPane splitPane = new SplitPane(new Pane(), new Pane()); 

    // Report changes to the divider position 
    splitPane.getDividers().get(0).positionProperty().addListener(
      o -> System.out.println(splitPane.getDividerPositions()[0]) 
    ); 

    // Doesn't work: 
    splitPane.setDividerPositions(0.8); 

    // The docs seem to recommend the following (with floats instead of 
    // doubles, and with one number more than there are dividers, which is 
    // weird), but it doesn't work either: 
    //splitPane.setDividerPositions(0.8f, 0.2f); 

    primaryStage.setScene(new Scene(splitPane)); 
    primaryStage.setMaximized(true); 
    primaryStage.show(); 
} 

Der Ausgang:

0.8 
0.5 

screenshot of result

Es legt nahe, dass etwas, das es in die Mitte zurücksetzt.

Wie kann ich das erreichen?

Antwort

-2

Versuchen

splitPane.setDividerPosition(0, percentage); 

Die Parameter sind setDividerPosition (int dividerIndex, Doppel percentage)

+0

Das ist im Wesentlichen das Gleiche wie was ich gepostet habe und ergibt genau das gleiche Ergebnis. Und es ist ein Wert zwischen 0,0 und 1,0, nicht wirklich ein Prozentsatz. – Midgard

+0

Es funktioniert in meinem Code. – Mark

+0

Ja. Es könnte eine Reihenfolge der Operationen sein. Versuchen Sie, eine Schaltfläche hinzuzufügen und die Methode dort einzufügen. – Mark

7

Das Problem scheint die Trennposition zurückgesetzt wird, wenn die Breite des SplitPane während der Maximierung der eingestellt ist Stage. Sie sollten es im Nachhinein setzen können, indem auf die showing Eigenschaft des Fensters hören:

primaryStage.showingProperty().addListener(new ChangeListener<Boolean>() { 

    @Override 
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
     if (newValue) { 
      splitPane.setDividerPositions(0.8); 
      observable.removeListener(this); 
     } 
    } 

}); 
0

Während Stage Initialisierung Fenstergröße mehrmals verändert, bis das Layout abgeschlossen ist. Jede Änderung verändert Teilerpositionen. Wenn Sie Teiler Positionen steuern möchten, müssen sie nachStage vollständig initialisiert eingestellt werden:

private boolean m_stageShowing = false; 

@Override 
public void start(Stage primaryStage) throws Exception { 
    SplitPane splitPane = new SplitPane(new Pane(), new Pane()); 

    ChangeListener<Number> changeListener = new ChangeListener<Number>() { 
     @Override 
     public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { 
      splitPane.setDividerPositions(0.8); 
      if (m_stageShowing) { 
       observable.removeListener(this); 
      } 
     } 
    }; 
    splitPane.widthProperty().addListener(changeListener); 
    splitPane.heightProperty().addListener(changeListener); 

    primaryStage.setScene(new Scene(splitPane)); 
    primaryStage.setMaximized(true); 
    primaryStage.show(); 
    m_stageShowing = true; 
} 
0

Ich hatte das gleiche Problem und die oben genannten Lösungen, bei denen nicht zuverlässig für mich arbeiten. Also habe ich eine benutzerdefinierte Skin für SplitPane:

public class DumbSplitPaneSkin extends SplitPaneSkin { 

    public DumbSplitPaneSkin(SplitPane splitPane) { 
    super(splitPane); 
    } 

    @Override 
    protected void layoutChildren(double x, double y, double w, double h) { 
    double[] dividerPositions = getSkinnable().getDividerPositions(); 
    super.layoutChildren(x, y, w, h); 
    getSkinnable().setDividerPositions(dividerPositions); 
    } 
} 

Diese Haut kann über CSS oder durch zwingende SplitPane.createDefaultSkin() verwendet werden. Sie können auch programmatisch als splitPane.setSkin (new DumbSplitPaneSkin (splitPane));