2010-02-22 9 views
20

En Swing, cuál es la mejor manera de hacer que el JSplitPane separe dos paneles con 50% de tamaño cada uno.División JSplitPane 50% con precisión

Parece que si no me puse tamaños preferidos en los paneles que siempre hace que el primer panel casi invisible (2%) y el segundo (98%)

Gracias de antemano

Respuesta

24

Uso

setResizeWeight(.5d);

[...] Un valor de 0, por defecto, indica el componente de la derecha/inferior se pone todo el espacio extra (la izquierda/arriba Componen t actúa fijo), donde como un valor de 1 especifica que el componente izquierdo/superior obtiene todo el espacio extra (el componente derecho/inferior actúa fijo). [...]

+5

setResizeWeight (doble) sólo se utiliza para "distribuir el espacio extra cuando el tamaño de los cambios de panel de división". No determina la distribución de espacio inicial. – Adamski

27

Debe utilizar setDividerLocation(double proportionalLocation) para determinar la distribución de espacio inicial del JSplitPane, y luego llamar a setResizeWeight(double) con el mismo valor para asegurar que los cristales cambian de tamaño en proporción.

Además, tenga en cuenta: Llamada setDividerLocation(double) antes de la JSplitPane es visible no funcionará correctamente, ya que el cálculo del espacio se basa en el tamaño actual Component 's. En lugar usted necesita para involucrar a un corte desagradable, como anulando el JPanel 's método de pintura que contiene el JSplitPane:

private boolean painted; 

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

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

+1 ¡Funciona genial! Solo una nota para el siguiente tipo que caiga en esto: tenga en cuenta la propiedad de "tamaño mínimo" de los componentes. Si el tamaño mínimo es mayor que el espacio disponible, el primer dibujo de JSplitPane funcionará bien, pero si cambia el tamaño del marco, se volverá a calcular. En ese caso, una solución rápida: 'component.setMinimumSize (new Dimensions (0,0))' –

4

que tenía un problema similar y lo solucioné mediante el uso de un oyente componente en el contenedor primario y establecer la ubicación del divisor en el primer cambio de tamaño. Inicializar una variable para firstResize verdadera y añadir esto en el constructor contenedor principal:

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

Esto debería hacer que el divisor para estar centrado cuando el tamaño del contenedor padre es el primer conjunto.

Cuestiones relacionadas