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.

È stato utile?

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 se setPreferredSize() 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 LayoutManagers 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 LayoutManagers differenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top