Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [Java] Problemi con JScrollPane

    Salve a tutti.
    Ho un problema con l'utilizzo dell'oggetto JScrollpane.
    Questo è quello che ottengo attualmente:

    L'applet, di dimensioni 734x480, è formata da due JPanel, il primo sopra alla barra orizzontale (JSeparator) e il secondo sotto, entrambi con layout FlowLayout.
    Scopo del 2° JPanel è quello di contenere una serie di oggetti (rappresentati dai quadrati in giallo) che possono variare di numero.
    Quello che vorrei sarebbe fissare la larghezza del pannello che contiene tali oggetti e renderlo variabile in altezza con un JScrollpane.
    Attualmente la porzione di codice è questa:

    codice:
            mainContent = new JPanel();
            mainContent.setLayout(new FlowLayout(FlowLayout.LEFT));
            //mainContent.setPreferredSize(new java.awt.Dimension(700, 420));
            jScrollPane1 = new JScrollPane(mainContent);
            jScrollPane1.setBorder(null);
            jScrollPane1.setPreferredSize(new java.awt.Dimension(700, 420));
    Come si nota dal codice, non ho fissato la grandezza del mainContent in quanto fissandola, effettivamente gli oggetti gialli vengono disposti secondo il FlowLayout andando a capo dopo 3, ma il JScrollpane non funziona correttamente.
    L'immagine sotto visualizza l'applet settando le dimensioni del mainContent:

    Questa seconda immagine fa notare come il JScrollpane entra in azione solo quando le dimensioni dell'applet vengono ridotte:

    E' come se il JScrollpane non tenesse conto delle dimensioni del mainContent che sono aumentate.

    Ora vi chiedo: come posso far funzionare il JScrollpane in modo corretto?

    Ringrazio già da ora chiunque possa aiutarmi e scusate per la lungezza del post.

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Il JScrollPane funziona in modo corretto. Il problema sta nel fatto che tu setti le dimensioni del pannello contenuto in JScrollPane sia in larghezza che in altezza. Le barre appaiono quindi quando la finestra e' piu' piccola delle dimensioni del pannello. Prova a mettere
    codice:
    int maxH = (int)mainContent.getMaximumSize().getHeight();
    mainContent.setPreferredSize(new java.awt.Dimension(700, maxH));

  3. #3
    Intanto grazie per la risposta, ma così facendo mi crea la barra verticale con lo scroller piccolissimo, ovvero mi fa scorrere tutto il JPanel che adesso è molto lungo, molto di più del dovuto.
    Fa conto che se avessi solo 2 degli oggetti gialli, la barra verticale non dovrebbe vedersi.
    Quello che vorrei fare è avere il maincontent con larghezza 700 e altezza 0, poi quando creo uno o più oggetti gialli la sua altezza aumenta (ed effettivamente questo avviene) e il JScrollPane, accorgendosi che il pannello in esso contenuto ha superato le sue dimensioni in altezza, visualizza la barra verticale per scrollare il contenuto (questo purtroppo non avviene).

    Scusa per la confusione nella spiegazione.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Si,ho capito. La cosa funziona cosi' nel momento in cui passi l'oggetto al JScrollPane,questo imposta le dimensioni dell'area visibile alle preferredSize dell'oggetto passato.
    Quando e' ha video le scroll appaiono solo se le dimensioni della fiestra sono piu' piccole di quelle dell'area di view dello scrollPane.
    Magari usando un'altro layout.

  5. #5
    Cioè? Che layout?
    E in ogni caso come può un cambiamento di layout far funzionare il JScrollPane?
    Scusa, ma non ho ben capito quello che hai scritto.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Come ho scritto sopra, il funzionamento anomalo non e' dovuto al JScrollPane.
    Allora tu hai un pannello, mettiamo di dimensioni 400x400, passi questo pannello al JScrollPane che ha questo punto ha dimensioni 400x400. Quando le dimensioni della finestra sono piu' piccole delle dimensioni dell'area di view dello scrollPane appaiono le barre.
    Piu' chiaro?

  7. #7
    Si più chiaro.
    Ho una domanda: ma nel caso della 2° immagine il pannello e di conseguenza il JScrollPane hanno una dimensione maggiore della finestra (si nota in quanto i quadrati gialli posti in basso vengono tagliati e al di sotto di loro ce ne sono altri 3), quindi perchè non vengono visualizzate le barre?
    Che soluzione mi proporresti?

    Grazie.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    No, nella seconda il pannello non ha dimensioni piu' grandi della finestra. I componenti che contiene sono piu' grandi della finestra e del pannello stesso, ma tu con setPrefferedSize applicato al pannello, forzi il pannello ad avere quelle dimensioni. Il resto che eccede semplicemente non lo vedi perche' fuori dal pannello.
    Io non setterei le dimensioni del pannello ed userei un layout diverso dal FlowLayout.Se say quanti quadratini inserirai e quanti ne vuoi per riga, usa un GridLayout e calcolati il numero di righe.
    Soluzione 2)(Tirata giu' in 5 min, non so se funziona correttamente)
    Usi questo layout ed oltre all'allineamento gli passi la dimensione che vuoi usare.
    codice:
    import java.awt.*;
    
    public class MyFlowLayout extends FlowLayout {
        private int fixedWidth;
        
        public MyFlowLayout(int align, int fixedWidth) {
            super(align);
            this.fixedWidth = fixedWidth;
        }
        
        public Dimension preferredLayoutSize(Container target) {
            Dimension d = null;
            int tmpW = 0, tmpH = 0, heigth = 0, nComps = target.getComponentCount();
            for (int i = 0; i < nComps; i++) {
                Component c = target.getComponent(i);
                if (c.isVisible()) {
                    d = c.getPreferredSize();
                    if(tmpW+d.getWidth()+this.getHgap()<fixedWidth) {
                        tmpW = tmpW + (int)d.getWidth()+this.getHgap();
                        if(d.getHeight()>tmpH) tmpH = (int)d.getHeight();
                    } else {
                        tmpW = 0;
                        heigth = heigth+tmpH+this.getVgap();
                        tmpH = 0;
                    }
                }
            }
            heigth = heigth+tmpH;
            heigth = heigth+target.getInsets().top+target.getInsets().bottom;
            d = new Dimension(fixedWidth, heigth);
            return d;
        }
    }

  9. #9
    Scusa per il ritardo nella risposta ma ho avuto un po' da fare in questo periodo.
    Ritornando al mio problema ti posso dire che l'ho risolto aggiornando manualmente l'altezza del mainContent (e anche quella del JScrollPane con il metodo setViewportView) in base a quanti componenti ho.
    Ora ho un altro piccolissimo problema non di vitale importanza ma che mi sta facendo impazzire, ovvero quando vengono create le barre del JSrcollPane la prima cella del GridBagLayout (il menù per intenderci) mi viene ristretta in altezza qualsiasi abbia impostata.

    Immagine con altezza menù 30px senza JScrollPane:
    Immagine con altezza menù 30px con JScrollPane:
    Immagine con altezza menù 300px senza JScrollPane:
    Immagine con altezza menù 300px con JScrollPane:
    Da queste immagini si può vedere che qualsiasi sia l'altezza fissata sulla prima cella del GridBagLayout comunque quando entra in funzione il JScrollPane si ridimensiona a quella grandezza.
    La prima immagine visualizza le dimensioni desiderate del menù.

    Questo è il codice:
    codice:
            c = getContentPane();
            c.setLayout(new GridBagLayout());
            
            cg = new GridBagConstraints();
            cg.fill = GridBagConstraints.HORIZONTAL;
            
            jPanel1 = new JPanel();
            jPanel1.setLayout(new FlowLayout(FlowLayout.LEFT));
            jPanel1.setPreferredSize(new java.awt.Dimension(100, 30));
                jButton1 = new JButton("add");
                jButton1.setFont(new java.awt.Font("verdana", 0, 11));
                jButton1.setMinimumSize(new Dimension(0, 0));
                jButton1.setSize(23,23);
                jButton1.setContentAreaFilled(false);
                jButton1.setMargin(new Insets(0,0,0,0));
                jButton1.setIcon(add);
                jButton1.setIconTextGap(5);
                jButton1.setToolTipText("add");
                jButton2 = new JButton("refresh");
                jButton2.setFont(new java.awt.Font("verdana", 0, 11));
                jButton2.setMinimumSize(new Dimension(0, 0));
                jButton2.setSize(23,23);
                jButton2.setContentAreaFilled(false);
                jButton2.setMargin(new Insets(0,0,0,0));
                jButton2.setIcon(refresh);
                jButton2.setIconTextGap(5);
                jButton2.setToolTipText("refresh");
                jLabel1 = new JLabel();
                jLabel1.setFont(new java.awt.Font("verdana", 0, 11));
                jLabel1.setText("asdasdadsdadadsa");
                jLabel1.setBackground(new Color(255,255,185));
                jLabel1.setBorder(null);
            jPanel1.add(jButton1);
            jPanel1.add(jButton2);
            jPanel1.add(jLabel1);
            cg.fill = GridBagConstraints.HORIZONTAL;
            cg.ipadx = 0;
            cg.weightx = 1.0;
            cg.weighty = 0.0;
            cg.gridx = 0;
            cg.gridy = 0;
            c.add(jPanel1, cg);
    
            jSeparator1 = new JSeparator();
            cg.ipady = 0;      
            cg.weightx = 0.0;
            cg.weighty = 0.0;
            cg.insets = new Insets(1,0,0,0);
            cg.fill = GridBagConstraints.HORIZONTAL;
            cg.gridwidth = 2;
            cg.gridx = 0;
            cg.gridy = 1;
            c.add(jSeparator1, cg);
            
            mainContent = new JPanel();
            mainContent.setLayout(new FlowLayout(FlowLayout.LEFT));
            mainContent.setPreferredSize(new java.awt.Dimension(700, 0));
            jScrollPane1 = new JScrollPane(mainContent);
            jScrollPane1.setBorder(null);
            cg.ipady = 0;      
            cg.weightx = 0.0;
            cg.weighty = 1.0;
            cg.fill = GridBagConstraints.BOTH;
            cg.gridwidth = 2;
            cg.gridx = 0;
            cg.gridy = 2;
            c.add(jScrollPane1, cg);
    Scusate per la lunghezza del post ma non sapevo fare altrimenti.

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Il gridBagLayout riaggiusta i componenti in automatico quando sono piu' grandi dell'area della finestra. Prova a dare un peso maggiore al pannello in alto quando lo inserisci,
    codice:
    cg.weighty = 1.0;
    e uno minore al JScrollPane (ricorda che i valori devono stare tra 0.0 e 1.0).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.