2010-02-22 8 views
20

In Swing, was ist der beste Weg, um die JSplitPane zu machen zwei jpanels mit 50% Größe jeweils zu teilen.JSplitPane Splitting 50% genau

Es sieht aus wie wenn ich nicht bevorzugte Größen auf den Platten festgelegt es macht immer die erste Platte fast unsichtbar (2%) und den zweiten (98%)

Vielen Dank im Voraus

Antwort

24

Verwenden

setResizeWeight(.5d);

[...] Ein Wert von 0, dem Standard zeigt die rechts/unten Komponente all den zusätzlichen Platz bekommt (links/oben componen t act fixed), wobei ein Wert von 1 angibt, dass die linke/obere Komponente den gesamten zusätzlichen Raum erhält (die rechte/untere Komponente wirkt fest). [...]

+5

setResizeWeight (double) nur zu „extra Raum zu verteilen, wenn die Größe der geteilten Scheibe ändert“ verwendet. Es bestimmt nicht die anfängliche Raumverteilung. – Adamski

27

sollten Sie setDividerLocation(double proportionalLocation) verwenden, um die anfängliche Raumverteilung des JSplitPane, um zu bestimmen, und dann setResizeWeight(double) mit dem gleichen Wert aufrufen, um sicherzustellen, dass die Scheiben im Verhältnis der Größe verändert werden.

Auch beachten: korrekt, wie der Raum Berechnung aktuelle Größe nicht funktionieren basiert auf der Component ‚s setDividerLocation(double) vor dem JSplitPane sichtbar ist aufrufen. Stattdessen müssen Sie ein gemeiner Hack zu beteiligen, wie das Überschreiben der JPanel ‚s paint-Methode, die das enthält JSplitPane:

private boolean painted; 

@Override 
public void paint(Graphics g) { 
    super.paint(g); 

    if (!painted) { 
     painted = true; 
     splitPane.setDividerLocation(0.25); 
    } 
} 
+0

+1 Es funktioniert super! Nur eine Anmerkung an den nächsten Typ, der darauf eingeht: Beachten Sie die Eigenschaft "Mindestgröße" der Komponenten. Wenn die Mindestgröße größer als der verfügbare Platz ist, funktioniert die erste Zeichnung von JSplitPane gut, aber wenn Sie die Größe des Rahmens ändern, wird er neu berechnet. In diesem Fall eine schnelle Lösung: 'component.setMinimumSize (new Dimensions (0,0))' –

4

Ich hatte ein ähnliches Problem, und ich löste es, indem eine Komponente Zuhörer in den übergeordneten Container mit und stellen Sie der Teilerort auf der ersten Größe. Initialisiere eine Variable firstResize auf true und fügen Sie diese in den übergeordneten Container Konstruktor:

addComponentListener(new ComponentAdapter(){ 
    @Override 
    public void componentResized(ComponentEvent e) { 
     if(firstResize){ 
      splitPane.setDividerLocation(0.5); 
      firstResize = false; 
     } 
    } 
}); 

Dies ist der Teiler zentriert wird dazu führen soll, wenn die übergeordneten Container Größe erster Satz.