2011-10-02 17 views
11

Estoy tratando de establecer la ubicación del divisor de un JSplitPane, pero parece que no funciona.Establecer la ubicación del divisor en un JSplitPane no funciona

He aquí un SSCCE:

import java.awt.Color; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSplitPane; 


public class JSplitProblem extends JFrame { 

    public JSplitProblem(){ 
     JPanel upperPanel = new JPanel(); 
     upperPanel.setLayout(new BoxLayout(upperPanel, BoxLayout.X_AXIS)); 

     JPanel leftPanel = new JPanel(); 

     leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS)); 
     JPanel red = new JPanel(); 
     red.setBackground(Color.red); 
     leftPanel.add(red); 

     JPanel rightPanel = new JPanel(); 
     rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); 
     JPanel blue = new JPanel(); 
     blue.setBackground(Color.blue); 
     rightPanel.add(blue); 

     upperPanel.add(leftPanel); 
     upperPanel.add(rightPanel); 
     JPanel bottomPanel = new JPanel(); 
     bottomPanel.setBackground(Color.black); 

     JSplitPane mainSplittedPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, upperPanel,bottomPanel); 
     mainSplittedPane.setOneTouchExpandable(true); 
     mainSplittedPane.setDividerLocation(0.5); 

     this.add(mainSplittedPane); 
     this.setSize(800,600); 
     this.setResizable(true); 
     this.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new JSplitProblem(); 
    } 

} 

Me gustaría que el panel inferior negro que yacía en un 50% de toda la zona por defecto. ¿Qué estoy haciendo mal?

+0

sencilla más uno para sscce – mKorbel

+1

setDividerLocation IIRC con una relación funciona sólo después de la SplitPane se ha hecho visible en un árbol de contenidos. Probablemente se deba a que el método calcula inmediatamente la ubicación real en píxeles, en función del tamaño actual. – jfpoilpret

+0

@jfpoilpret: sí. Lo entendí por la respuesta de mKorbel. De lo contrario, el uso de invocará posterior no afectará a ella. Gracias por señalar de todos modos. – Heisenbug

Respuesta

7

nada complicated in this case, con reglas

1) PrefferedSize debe returns Childs no lo que mal para poner en mi caso también :-), entonces mi respuesta es no resisten demasiado @kleopatra

2) poner todo sobre rezize, tamaño, lo que sea para JSplitPane en invokeLater() .

enter image description here .

import java.awt.*; 
import javax.swing.*; 

public class JSplitProblem extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JSplitPane mainSplittedPane; 

    public JSplitProblem() { 
     JPanel upperPanel = new JPanel(); 
     upperPanel.setLayout(new BoxLayout(upperPanel, BoxLayout.X_AXIS)); 
     JPanel leftPanel = new JPanel(); 
     leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS)); 
     JPanel red = new JPanel(); 
     red.setBackground(Color.red); 
     leftPanel.add(red); 
     JPanel rightPanel = new JPanel(); 
     rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); 
     JPanel blue = new JPanel(); 
     blue.setBackground(Color.blue); 
     rightPanel.add(blue); 
     upperPanel.add(leftPanel); 
     upperPanel.add(rightPanel); 
     JPanel bottomPanel = new JPanel(); 
     bottomPanel.setBackground(Color.black); 

     mainSplittedPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, upperPanel, bottomPanel); 
     mainSplittedPane.setOneTouchExpandable(true); 
     mainSplittedPane.setDividerLocation(0.5); 

     add(mainSplittedPane); 
     setPreferredSize(new Dimension(400, 300)); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setResizable(true); 
     setVisible(true); 
     pack(); 
     restoreDefaults(); 
    } 

    private void restoreDefaults() { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       mainSplittedPane.setDividerLocation(mainSplittedPane.getSize().height /2); 
       //mainSplittedPane.setDividerLocation(mainSplittedPane.getSize().width /2); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     JSplitProblem jSplitProblem = new JSplitProblem(); 
    } 
} 
+0

oh ... gracias por la respuesta, pero todavía tengo algún problema (y he sido un poco impreciso al hacer la pregunta). El punto es que tu solución solo funciona si no cambio el tamaño del marco. Si cambio manualmente el tamaño de la proporción de fotogramas no se mantiene. ¿Hay alguna manera de mantener la ubicación de la derivación siempre a un cierto valor? +1 de todos modos – Heisenbug

+0

sí, muy simple, debe agregar WindowListener, anular ResizeEvent (s), pero notará que llama a 'restoreDefaults()' para retrasar eso con 'java.swing.Timer', porque nunca se sabe se resize termina, porque si el tamaño continúa, entonces solo para reiniciar el 'Timer' :-) – mKorbel

+0

+1 la clave es que el setDividerLocation (doble) solo funciona en una GUI visible ya que no puede calcular la proporción de tamaño hasta la división el panel en realidad tiene un tamaño. En el ejemplo simple no hay necesidad de usar invokeLater. Simplemente invocar el método setDividerLocation (...) después de que el pack(), setVisible (verdadero). Si desea utilizar el método restoreDefaults(), debe invocarlo cuando cree el panel dividido. – camickr

3

No estoy seguro, pero creo que deberías intentar pack() tu marco. Y si eso no funciona, intente restablecer la ubicación del divisor después de empaquetar el marco.

12

Si quieres las dos mitades del panel de división para compartir en el espacio adicional o eliminado del panel dividido, ajuste el peso de redimensionamiento a 0,5: (Tutorial)

JSplitPane mainSplittedPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, upperPanel,bottomPanel); 
mainSplittedPane.setOneTouchExpandable(true); 
mainSplittedPane.setResizeWeight(0.5);        
+1

+1: gracias por setResizeWeight. Voy a jugar con él un poco y ver qué puedo hacer. – Heisenbug

1

Simplemente agregue el siguiente código, y eso será suficiente.

mainSplittedPane.setResizeWeight(0.5); 
Cuestiones relacionadas