2011-10-02 13 views
11

Sto tentando di impostare la posizione del divisore di un JSplitPane ma sembra non funzionare.L'impostazione della posizione del divisore su un JSplitPane non funziona

Ecco uno 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(); 
    } 

} 

Vorrei pannello di fondo nero per giaceva su un 50% di tutta l'area per impostazione predefinita. Che cosa sto facendo di sbagliato?

+0

semplice più uno per sscce – mKorbel

+1

IIRC setDividerLocation con un rapporto operativo solo quando lo SplitPane è stata resa visibile in una gerarchia di contenimento. Ciò è probabilmente dovuto al fatto che il metodo calcola immediatamente la posizione effettiva in pixel, in base alla dimensione corrente. – jfpoilpret

+0

@jfpoilpret: sì. L'ho capito dalla risposta di mKorbel. Altrimenti usare invoke in seguito non lo effettuerà. Grazie per aver segnalato comunque. – Heisenbug

risposta

7

nulla complicated in this case, con regole

1) PrefferedSize deve returns Childs non come ho sbagliato a impostare nel mio caso troppo :-), allora la mia risposta è non @kleopatra resistere troppo

2) mettere tutto di ridimensionare le, dimensioni, qualunque sia per JSplitPane in 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..grazie per la risposta, ma ho ancora qualche problema (e sono stato un po 'impreciso mentre facevo la domanda). Il punto è che la tua soluzione funziona solo se non ridimensiono la cornice. Se ridimensiono manualmente la proporzione del frame non viene mantenuta. C'è un modo per mantenere la posizione del diver sempre ad un certo valore? +1 in ogni caso – Heisenbug

+0

sì molto semplice, devi aggiungere WindowListener, scavalcare opportune ResizeEvent (s), ma nota che chiama 'restoreDefaults()' per ritardarlo con 'java.swing.Timer', perché non lo sai mai è ridimensionato termina, perché se il ridimensionamento continua, quindi solo per riavviare il 'Timer' :-) – mKorbel

+0

+1 la chiave è che setDividerLocation (double) funziona solo su una GUI visibile poiché non può calcolare il rapporto di dimensione fino alla divisione il riquadro ha effettivamente una dimensione. Nel semplice esempio non è necessario utilizzare invokeLater. Basta invocare il metodo setDividerLocation (...) dopo il pacchetto(), setVisible (true). Se si desidera utilizzare il metodo restoreDefaults(), è necessario richiamarlo quando si crea lo splitpane. – camickr

3

Non sono sicuro, ma penso che dovresti provare a pack() il tuo frame. E se ciò non funziona, prova a ripristinare la posizione del divisore dopo aver imballato la cornice.

12

Se si desidera entrambe le metà del riquadro diviso a condividere lo spazio extra o rimosso del riquadro di divisione, impostare il peso di ridimensionamento a 0,5: (Tutorial)

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

+1: grazie per setResizeWeight. Ci giocherò un po 'e vedrò cosa posso fare. – Heisenbug

1

Basta aggiungere il codice di seguito, e questo sarà abbastanza equo.

mainSplittedPane.setResizeWeight(0.5); 
Problemi correlati