2010-02-22 14 views
20

In Swing, qual è il modo migliore per fare in modo che JSplitPane divida due jpanel con il 50% di dimensione ciascuno.JSplitPane che divide il 50% con precisione

Sembra che se non imposto dimensioni preferite sui pannelli rende sempre il primo pannello quasi invisibile (2%) e la seconda (98%)

Grazie in anticipo

risposta

24

Usa

setResizeWeight(.5d);

[...] Un valore pari a 0, il default, indica/componente in basso a destra ottiene tutto lo spazio extra (sinistra/componen top t act fixed), dove come valore 1 specifica che il componente left/top ottiene tutto lo spazio extra (il componente right/bottom agisce fisso). [...]

+5

setResizeWeight (doppia) viene utilizzato solo per "distribuire spazio in più quando la dimensione dei cambiamenti riquadro split". Non determina la distribuzione dello spazio iniziale. – Adamski

27

Si dovrebbe usare setDividerLocation(double proportionalLocation) per determinare la distribuzione spazio iniziale del JSplitPane, e quindi chiamare setResizeWeight(double) con lo stesso valore per garantire che le lastre vengono ridimensionate in proporzione.

Inoltre, essere consapevoli: Chiamare setDividerLocation(double) prima della JSplitPane è visibile non funziona correttamente, come il calcolo dello spazio si basa su dimensioni attuali s' il Component. Invece è necessario coinvolgere un brutto hack, come ad esempio ignorando s' metodo paint l'JPanel che contiene il JSplitPane:

private boolean painted; 

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

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

+1 Funziona benissimo! Solo una nota per il prossimo che cade in questo: essere consapevoli della proprietà "dimensione minima" dei componenti. Se la dimensione minima è maggiore dello spazio disponibile, la prima estrazione di JSplitPane funzionerà correttamente, ma se ridimensioni la cornice, verrà ricalcolata. In tal caso, una soluzione rapida: 'component.setMinimumSize (new Dimensions (0,0))' –

4

ho avuto un problema simile e ho risolto utilizzando un ascoltatore componente nel contenitore padre e impostare la posizione del divisore sul primo ridimensionamento. Inizializzare un firstResize variabile true e aggiungere questo nel costruttore contenitore padre:

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

Questo dovrebbe causare il divisore per essere centrato quando la dimensione contenitore principale è prima serie.

Problemi correlati