JPanel le dimensioni preferite per non essere Set
-
26-10-2019 - |
Domanda
Quando si è la dimensione preferita di un insieme JPanel se non si imposta in modo esplicito?
Ho il seguente codice:
private static class ScrollableJPanel extends JPanel implements Scrollable {
@Override
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
.
.
.
}
e questo codice:
myPanel = new ScrollableJPanel();
// Add a bunch of controls to the panel.
final JScrollPane scroll = new JScrollPane(myPanel);
scroll.setAutoscrolls(true);
scroll.setHorizontalScrollBarPolicy(
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
Tuttavia, la dimensione preferita del myPanel all'epoca getPreferredScrollableViewportSize () viene chiamato sembra essere un valore arbitrario, (4225, 34), e prefSizeSet ??= false.
In base alla documentazione Java , questo è un modo ragionevole per definire questo metodo. Tuttavia, la dimensione effettiva del myPanel è molto superiore a 34 pixel, quindi la porta di visualizzazione è troppo piccola.
Che cosa sto facendo male qui? Devo impostare la dimensione preferita di myPanel esplicitamente? Ho provato, ma voglio utilizzare la dimensione reale determinato dal gestore di layout, non solo fare una supposizione che sarà sovrascritto in seguito.
Si noti che la mia domanda non è come impostare una dimensione esatta per il JPanel. Voglio che il gestore di layout per farlo. Né voglio avere in modo esplicito impostare la dimensione preferita. Ho pensato che è stato gestito anche dal gestore di layout. Quello che voglio sapere è perché il gestore di layout non è la creazione di un valore ragionevole per la dimensione preferita per sé in modo che possa restituire un PreferredScrollableViewportSize ragionevole.
Soluzione
La dimensione preferita di un JPanel si basa sui componenti del pannello. Il gestore layout calcola una dimensione preferita del pannello, in base alla dimensione preferita degli elementi del pannello, e se alcune di queste cose sono pannelli, allora è un calcolo ricorsivo. Se non ci sono componenti secondari nel pannello, quindi la dimensione preferita dovrà essere impostato in modo esplicito.
Altri suggerimenti
In AWT (e poi oscillare), Container.getPreferredSize()
sia:
- restituisce la dimensione esplicitamente fissato dal
setPreferredSize()
, - o la dimensione calcolato dal
LayoutManager
sesetPreferredSize()
non è stato chiamato in modo esplicito
Quindi, ciò che restituisce getPreferredSize()
dipende fortemente su cui LayoutManager
che si utilizza per il vostro ScrollableJPanel
.
Essere consapevoli del fatto che la maggior parte LayoutManager
s useranno getPreferredSize()
su tutti i figli diretti del Container
su cui è stato chiamato getPreferredSize()
. Questo è un processo ricorsivo (se i bambini hanno figli stessi) e possono coinvolgere diversi LayoutManager
s differenti.