2009-05-11 20 views

risposta

17

Dopo aver guardato il codice sorgente per pack(), mi si avvicinò con:

panel.setPreferredSize(panel.getPreferredSize()); 

In questo modo il pannello di ricalcolare la sua dimensione preferita in base alle dimensioni preferite dei suoi subcomponenents.

In seguito, potrebbe essere necessario o non dovere chiamare validate(); nel mio piccolo esempio, mi è sembrato di fare alcuna differenza, ma il Javadoc dice:

Il metodo validate viene utilizzato per causare un contenitore per disporre le sue sottocomponenti di nuovo. Dovrebbe essere invocato quando i sottocomponenti di questo contenitore vengono modificati (aggiunti o rimossi dal contenitore o modificate le informazioni relative al layout) dopo che il contenitore è stato visualizzato.

Quindi immagino dipenda dal motivo per cui si deve reimballare il proprio JPanel.

+0

Thanks.It'll essere ok se non setSize, setPreferredSize o setMinimumSize. –

1

forse si può fare qualcosa di simile, rimuovendo dal tuo pannello

setResizable (false);

3

Per impostazione predefinita, Container s hanno una dimensione preferita che corrisponde alla dimensione di layout preferita data dal contenitore. Quindi, letteralmente tutto quello che dovete fare è:

panel.setSize(panel.getPreferredSize()); 

Presumibilmente si sta facendo qualcosa di strano con il genitore per fermare gestore di layout del genitore a fare l'equivalente di questo.

1

proverei:

panel.revalidate(); 
panel.repaint(); 

Questo non sarà necessariamente impostare il pannello per la sua dimensione preferita, che è più dipendente da ciò che il gestore di layout decide di utilizzare.

Questo è utile nei casi in cui sono stati aggiunti/rimossi componenti da un pannello che è attualmente visualizzato e visibile.

Aggiornamento: Sulla base dello screenshot, posso dire quanto segue: 1) Prendere in considerazione la possibilità di modificare in modo programmatico la posizione del divisore. 2) Considera di ridimensionare in modo programmato la finestra stessa orizzontalmente poiché sembra un po 'stretto per mostrare entrambi i lati del riquadro diviso. O entrambi. È possibile impostare la posizione di divisione facendo

splitPane.setDividerLocation(newSize); 

Tenete a mente che ci sono due metodi di overload per questo, uno prendendo un galleggiante uno prendendo un int. Il float fa una percentuale della dimensione mentre int è la dimensione in pixel. La dimensione è per il pannello di sinistra (o il pannello superiore per quell'orientamento). Considererei possibilmente la modifica della posizione del partitore in base alla larghezza preferita dei pannelli.

+0

vedi modifica per il problema esatto –

0

JSplitPanes sono un po 'pignoli quando si tratta delle taglie dei bambini, dai uno sguardo allo the Java tutorial. Stai utilizzando GridBagLayout correttamente? Sembra che non abbia impostato correttamente la giusta dimensione minima di JPanel.

0

I misteri di javax.swing si rivelano solo gradualmente, e solo a coloro che sono disposti a offrire molte libagioni (in particolare ciuffi di capelli, ore che bruciano l'olio di mezzanotte, ecc.) Agli dei di Swing.

Tuttavia, per questo caso in punto vorrei suggerire quanto segue come una sorta di coltellino svizzero che di solito fa quello che pensi il quadro dovrebbe fare comunque:

myJPanel.getTopLevelAncestor().validate() 

Come il testo sacro dice: "Convalida questo contenitore e tutti i suoi sottocomponenti. " (Container.validate). NB getTopLevelAncestor() è un metodo JComponent.

Non riesco a ricordare come JSplitPane si adatta a questo: provalo e probabilmente scoprirai che convalida entrambi i componenti (destro e sinistro, alto e basso), ma sarei sorpreso se cambiare il divisore non lo faccia questo per te comunque.

1

Ho avuto un problema simile utilizzando Netbeans GUI Builder. I miei pannelli interni stavano diventando di dimensioni strane; Stavo cercando di regolare manualmente le dimensioni minime e preferite, il che era un esercizio frustrante.

Il problema è stato risolto quando ho ripristinare tutte le minime e le dimensioni preferite di nuovo a difetto (in NetBeans GUI Builder: tasto destro del mouse componente JPanel -> Proprietà -> PreferredSize -> Reset to Default). Quando non ci sono dimensioni imposte, la jpanel prende la dimensione del componente interno.

Nota: GridBaLayout è stato utilizzato nel mio caso

Problemi correlati