Non riesco a ridimensionare uno JScrollPane

di il
4 risposte

Non riesco a ridimensionare uno JScrollPane

Ciao a tutti,
come scritto nel titolo mi sta risultando impossibile ridimensionare uno scroll pane. Esso contiene una tabella, il problema è che occupa tutto il frame sottostante indipendentemente. Ho provato con preferredSize() ma non cambia, ho provato tutti i layout manager. Ho cercato tanto online ma non riesco a capire perchè faccia così, non cambia la sua dimensione.
Quello che vorrei fare è renderlo proporzionale alla tabella che contiene per lo meno, e soprattutto che non occupi tutto il frame ma che abbia una dimensione fissata da me (che poi sarebbe la larghezza che do alla tabella) ed inoltre vorrei si posizionasse al centro del frame.
Vi posto la parte di codice in cui viene utilizzato, spero possiate aiutarmi, grazie in anticipo.

		TableNamesDiscipline table = new TableNamesDiscipline(listNamesDiscipline); //TableNamesDiscipline è un table model
		namesDisciplina = new JTable(table);
		namesDisciplina.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		namesDisciplina.getColumnModel().getColumn(0).setPreferredWidth(200);
		scrollPane = new JScrollPane(namesDisciplina);
		scrollPane.setPreferredSize(new Dimension(200,200));
        	getContentPane().add(scrollPane, BorderLayout.CENTER);

4 Risposte

  • Re: Non riesco a ridimensionare uno JScrollPane

    rossociliegia ha scritto:


            	getContentPane().add(scrollPane, BorderLayout.CENTER);
    Il punto è questo. Il contentPane ha di serie il BorderLayout, che gestisce solo 5 aree. Il componente nella parte CENTER occupa tutto lo spazio a meno dello spazio eventualmente occupato dalle altre 4 aree.
    Nella parte CENTER il BorderLayout di fatto IGNORA qualunque dei setPreferredSize/setMinimumSize/setMaximumSize. Questo perché la parte CENTER è in sostanza una specie di "jolly", prende tutto quanto non occupato dal resto.

    Supponiamo ci sia solo qualcosa in CENTER. La dimensione del componente NON dipende dai suoi settaggi ma dipende SOLO dalla dimensione del contenitore (qui è il contentPane). Ma la dimensione del contentPane dipende direttamente dalla dimensione della finestra.
    In sostanza la dimensione di CENTER dipende transitivamente .... dalla finestra! E' chiara la spiegazione?

    Se vuoi fare diversamente, si può fare. Puoi impostare nel contentPane un GridBagLayout. Se ci inserisci solo 1 componente, anche senza alcun constraint (il GridBagConstraints), il componente starà centrato e alla sua dimensione "preferita" (che ha di serie o settabile da setPreferredSize).
  • Re: Non riesco a ridimensionare uno JScrollPane

    andbin ha scritto:


    Se vuoi fare diversamente, si può fare. Puoi impostare nel contentPane un GridBagLayout. Se ci inserisci solo 1 componente, anche senza alcun constraint (il GridBagConstraints), il componente starà centrato e alla sua dimensione "preferita" (che ha di serie o settabile da setPreferredSize).
    Grazie mille! Ci sono riuscita ad avere l'effetto che desideravo.

    Avrei un'altra domanda se puoi aiutarmi, anzi un paio, la prima è: c'è un modo per far adattare lo scroll panel automaticamente alla lunghezza della tabella? Considerando che è una tabella diciamo a "scatola chiusa", cioè che prende i dati da un database perciò non sai mai a priori quanto sarà lunga. La seconda, che poi eliminerebbe quello che chiedo nella prima domanda, è: si può rendere il bordo dello scroll pane non visibile? Il mio problema è che mi disturba troppo vedere il quadrato del componente.
  • Re: Non riesco a ridimensionare uno JScrollPane

    rossociliegia ha scritto:


    c'è un modo per far adattare lo scroll panel automaticamente alla lunghezza della tabella?
    Intendi "altezza"? Quindi vuoi che:
    - se la tabella è relativamente piccola, sia centrata e con spazio vuoto attorno
    - se la tabella cresce di altezza può arrivare fino al limite della altezza del contenitore (contentPane nel tuo caso) ma senza sforare.

    rossociliegia ha scritto:


    si può rendere il bordo dello scroll pane non visibile?
    Lo puoi togliere, nel senso di settarne uno "vuoto":

    tuoScrollPane.setBorder(BorderFactory.createEmptyBorder());

    Ma vedi se "piace".
  • Re: Non riesco a ridimensionare uno JScrollPane

    Nota, non sono sicuro se è quanto vuoi e se piacerà ....

    a) Estendi JTable (anche "al volo" con una anonymous inner class) in modo da ridefinire il suo getPreferredScrollableViewportSize() così:
    public Dimension getPreferredScrollableViewportSize() {
        return getPreferredSize();
    }
    b) Estendi JScrollPane (stesso discorso come sopra) in modo da ridefinire il suo getMinimumSize() così:
    public Dimension getMinimumSize() {
        return getPreferredSize();
    }

    c) Aggiungi il tuo scrollpane con un GridBagConstraints così:
    GridBagConstraints c = new GridBagConstraints();
    c.weightx = 1;
    c.weighty = 1;
    
    getContentPane().add(tuoScrollPane, c);
    Chiaramente il contentPane deve avere il GridBagLayout.

    Il getMinimumSize ridefinito del JScrollPane può sembrare "strano" ma la motivazione c'è ...
    Anche i weightx/weighty hanno una motivazione ben precisa.
Devi accedere o registrarti per scrivere nel forum
4 risposte