2009-12-10 6 views
13

Ho un JSplitPane che, se visualizzato, dovrebbe dividere il riquadro del 50%.JSplitPane SetDividerLocation Problema

Ora dando un argomento di 0,5 (come suggerito) per impostareDividerLocation, Java sembra trattarlo come un numero normale anziché una percentuale. Come in, il divisore, invece di andare al centro del riquadro, è quasi all'inizio del riquadro sinistro (il riquadro è diviso verticalmente). Qualsiasi lavoro intorno?

risposta

13

Il metodo setDividerLocation (double) funziona solo su un frame "realizzato", ovvero dopo aver impacchettato o reso visibile il frame.

Il metodo setDividerLocation (int) può essere utilizzato in qualsiasi momento.

1

Se sei felice che il divisore si sposti al centro ogni volta che ridimensioni il riquadro, puoi aggiungere un ComponentListener e il suo componenteRisized method chiama setDividerLocation (0.5).

+3

Si potrebbe utilizzare il setResizeWeight (...) metodo per questo. – camickr

3

questo lo fissa:

public class JSplitPane3 extends JSplitPane { 
    private boolean hasProportionalLocation = false; 
    private double proportionalLocation = 0.5; 
    private boolean isPainted = false; 

    public void setDividerLocation(double proportionalLocation) { 
     if (!isPainted) { 
      hasProportionalLocation = true; 
      this.proportionalLocation = proportionalLocation; 
     } else { 
      super.setDividerLocation(proportionalLocation); 
     } 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     if (!isPainted) { 
      if (hasProportionalLocation) { 
       super.setDividerLocation(proportionalLocation); 
      } 
      isPainted = true; 
     } 
    } 

} 
+0

Solo per chiarimenti, ho ottenuto che funzioni usando solo paint() e no hasProportionalLocation se lo indico manualmente nel codice. Molto più breve di questa mostruosità – TheLQ

+0

Grazie. Mi sono appena imbattuto in questo e ci ha tormentato da secoli. +1 – Andez

+0

Ho sempre usato questo approccio. Tuttavia, ho notato che si vede momentaneamente la posizione del divisore nella posizione sbagliata prima che venga spostata. Per risolvere questo problema, invece di sovrascrivere la vernice (Grafica), ho invece scelto di sovrascrivere validate(). – Adamski

0

C'è una soluzione here che è una funzione semplice che non richiede sub-classing o altre modifiche al SplitPane.

26

Mi manca qualcosa? Sembra che ci siano molte risposte piuttosto complicate a questa domanda ... ma penso che un semplice setResizeWeight (0.5) risolverebbe il problema ... è descritto nel SplitPane Tutorial

+1

+1 - anche descritto (nascosto ?!) come commento alla risposta di lins314159 ... –

+0

Oh oops, ho trascurato questo nei commenti. Grazie. Sembra strano, anche se la risposta più popolare non l'ha menzionata ... su una domanda che ha 2 anni ora. –

+0

+1 Questa dovrebbe essere la risposta accettata –

1

Questo funziona per me, basato su Dave Rays link.

/** 
* Set JSplitPane proportional divider location 
* 
* @param jsplitpane JSplitPane to set 
* @param proportionalLocation double <0.0; 1.0> 
*/ 
public static void setJSplitPaneDividerLocation(final JSplitPane jsplitpane, final double proportionalLocation) 
{ 
    if (jsplitpane.isShowing()) 
    { 
     if (jsplitpane.getWidth() > 0 && jsplitpane.getHeight() > 0) 
     { 
      jsplitpane.setDividerLocation(proportionalLocation); 
     } 
     else 
     { 
      jsplitpane.addComponentListener(new ComponentAdapter() 
      { 
       @Override 
       public void componentResized(ComponentEvent ce) 
       { 
        jsplitpane.removeComponentListener(this); 
        setJSplitPaneDividerLocation(jsplitpane, proportionalLocation); 
       } 
      }); 
     } 
    } 
    else 
    { 
     jsplitpane.addHierarchyListener(new HierarchyListener() 
     { 
      @Override 
      public void hierarchyChanged(HierarchyEvent e) 
      { 
       if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0 && jsplitpane.isShowing()) 
       { 
        jsplitpane.removeHierarchyListener(this); 
        setJSplitPaneDividerLocation(jsplitpane, proportionalLocation); 
       } 
      } 
     }); 
    } 
} 
1

uso setResizeWeight(double);

0

quanto segue nel Component con l'JSplitPane lo fa troppo:

@Override 
public void setVisible(final boolean b) { 
    super.setVisible(b); 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      AppFrame.this.jSplitPane.setDividerLocation(0.9d); 
     } 

    }); 
} 
6

È possibile impostare solo la posizione del divisore riquadro diviso in percentuale quando il riquadro diviso è visibile . È possibile toccare gli eventi del proprietario del riquadro diviso per determinare quando è OK impostare la posizione del divisore. Per esempio:

public class MyFrame extends JFrame { 

    public MyFrame() { 

    final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 
    // ... set up the split pane, and add to the frame ... 

    // Listen for the frame's "shown" event. 

    addComponentListener(new ComponentAdapter() { 

     @Override 
     public void componentShown(ComponentEvent componentEvent) { 

     // Set the divider location to 20%. 
     // This works because we know the pane is visible. 

     splitPane.setDividerLocation(.2); 

     // Stop listening for "shown" events. 

     removeComponentListener(this); 
     } 

    }); 

    pack(); 
    } 
} 
0

ho trovato la combinazione di setResizeWeight e setDividerLocation invocato in seguito fornisce il comportamento che ci si aspetterebbe:

_splitPane.setResizeWeight(0.5); 

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     _splitPane.setDividerLocation(0.5); 
    } 
});