Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    31

    Barra verticale JScrollPane non parte dall'inizio

    Salve ragazzi, ho una finestra che viene riempita con diversi elementi dentro presi da un database e ho inserito uno JScrollPane. Funziona tutto bene tranne per il fatto che quando apro la finestra, la barra parte da poco sotto la metà della mia finestra mentre vorrei che partisse dall'alto. Non so proprio dove sia l'errore. Mi date una mano?

    Questo è il codice della mia finestra... Deve visualizzare una lista di discipline sportive con immagine, affianco descrizione, sotto testimonianza con costo mensile e poi così le altre.
    Vi avviso che comunque uso da pochissimo Java quindi se vedete cose non proprio eleganti è per questo.

    Grazie

    codice:
    public class ListaDiscipline extends JFrame
    {
     ArrayList<Disciplina> listaDiscipline;
     JButton indietro=new JButton("Indietro");
     JPanel p=new JPanel();
     JPanel s=new JPanel();
     JScrollPane scrollesterno;
     
     
     public ListaDiscipline()
     {
         super("Lista Discipline");
         Container c=this.getContentPane();
         listaDiscipline = DisciplinaDAO.getInstance().getListaDiscipline();
         int nDisc=listaDiscipline.size();
         
         ImageIcon[] immagini = new ImageIcon[nDisc];
         JLabel listaIcone[]=new JLabel[nDisc];
         JLabel costi[]=new JLabel[nDisc];
         JTextArea areedescr[]=new JTextArea[nDisc];
         JTextArea areetest[]=new JTextArea[nDisc];
         Border border = BorderFactory.createLineBorder(Color.BLACK);
         JPanel sp[]=new JPanel[nDisc];
         JPanel st[]=new JPanel[nDisc];
         JPanel sez[]=new JPanel[nDisc];
         int i,j,k,w;
         
         //Carico tutti i componenti
         for(i=0;i<nDisc;i++)
         {
             
             immagini[i]=new ImageIcon(listaDiscipline.get(i).immagineDisc);
             listaIcone[i]=new JLabel(immagini[i]);
             areedescr[i]=new JTextArea(listaDiscipline.get(i).descrizioneDisc);
             areedescr[i].setLineWrap(true);
             areedescr[i].setBorder(border);
             areedescr[i].setEditable(false);
             areetest[i]=new JTextArea(listaDiscipline.get(i).testimonianzaDisc);
             areetest[i].setBorder(border);
             areetest[i].setLineWrap(true);
             areetest[i].setEditable(false);
             String cost=Float.toString(listaDiscipline.get(i).costoMensileDisc);
             costi[i]=new JLabel("                             Il costo mensile è di € "+ cost);
         }
         
         p.setLayout(new GridLayout(nDisc,1,0,80));
         
         for(j=0;j<nDisc;j++)
         {
             sp[j]=new JPanel(new GridLayout(1,2,20,20));
             st[j]=new JPanel(new GridLayout(1,2,20,20));
             sp[j].add(listaIcone[j]);
             sp[j].add(areedescr[j]);
             st[j].add(areetest[j]);
             st[j].add(costi[j]);
         }
         BoxLayout boxsez[]=new BoxLayout[nDisc];
         
         for(k=0;k<nDisc;k++)
         {
             sez[k]=new JPanel();
             boxsez[k]=new BoxLayout(sez[k],BoxLayout.Y_AXIS);
             sez[k].setLayout(boxsez[k]);
             sez[k].add(sp[k]);
             sez[k].add(st[k]);
         }
         
         for(w=0;w<nDisc;w++)
         {
             p.add(sez[w]);
         }
         
         s.setLayout(new BorderLayout());
         s.add(indietro, BorderLayout.NORTH);
         s.add(p,BorderLayout.CENTER);
         
         
    
         scrollesterno = new JScrollPane(s);
         scrollesterno.getVerticalScrollBar().setUnitIncrement(7);
         c.add(scrollesterno);
         
         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
         this.setSize(700,484);
         this.setLocation(300,150);
         this.setVisible(true);
         this.setResizable(false);

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ciao, prima di guardare bene il tuo codice ti do un consiglio: ci semplificheresti molto la vita se postassi quello che viene definito un SSCCE, soprattutto perché il tuo problema è a livello grafico, quindi non è detto che basti dare una letta a quello che hai postato per trovare un errore.

    Per aiutarti più facilmente sarebbe utile poter compilare ed eseguire il codice, vedendo da noi il problema e potendo modificare il codice per vedere se funziona dopo le modifiche.
    Se però uno deve aggiungere gli import, togliere le classi che non abbiamo a disposizione (es. DisciplinaDAO) etc... perde parecchio tempo solo a sistemare il codice.

    Questa parte falla tu: cerca di mettere solo le cose essenziali a riprodurre il problema, fornendo un esempio che sia già compilabile ed eseguibile (leggi il link per maggiori dettagli)

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    31
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Ciao, prima di guardare bene il tuo codice ti do un consiglio: ci semplificheresti molto la vita se postassi quello che viene definito un SSCCE, soprattutto perch� il tuo problema � a livello grafico, quindi non � detto che basti dare una letta a quello che hai postato per trovare un errore.

    Per aiutarti pi� facilmente sarebbe utile poter compilare ed eseguire il codice, vedendo da noi il problema e potendo modificare il codice per vedere se funziona dopo le modifiche.
    Se per� uno deve aggiungere gli import, togliere le classi che non abbiamo a disposizione (es. DisciplinaDAO) etc... perde parecchio tempo solo a sistemare il codice.

    Questa parte falla tu: cerca di mettere solo le cose essenziali a riprodurre il problema, fornendo un esempio che sia gi� compilabile ed eseguibile (leggi il link per maggiori dettagli)
    Ciao! Allora, se ho ben capito dovrei fornirvi un codice semplificato che se compilato da solo vi permette di vedere la mia finestra e quindi di analizzare il problema senza dover importare le altre classi e avete di gran lunga ragione. Cosi' ho fatto una cosa, ho scritto la finestra senza utilizzare la classe DisciplinaDAO (che mi prende i dati dal database) ma ho inserito manualmente le discipline e non mi da' alcun problema! O.O Per cui ho pensato: l'altra classe e' praticamente identica, se non per il fatto che usa i cicli for per riempire i componenti a seconda di quanti elementi ci sono nel database. Cosi' ho lanciato la finestra dal main come prima finestra e va anche qui tutto bene. Cosi' ho capito che il problema succede quando: Il main chiama la prima finestra di benvenuto, l'utente clicca su discipline, si apre la finestra incriminata con le discipline e lo scroll sta sotto la meta' mentre voglio che parta dall'inizio.
    Ricapitolando il problema si pone solo e soltanto quando la finestra di benvenuto chiama quella delle discipline. Se apro quella delle discipline come prima direttamente dal main invece non succede.
    Ora, come posso fare?

    Io comunque la classe che ho creato manualmente ve la posto lo stesso, basta solo poi chiamarla nel main... ma e' lunga proprio perche' non ho potuto usare i for dovendo mettere tutto a mano passo passo... Per quanto riguarda le foto, vi posto sotto le tre foto e inserite il loro percorso nella stringa. Piu' di cosi' non riesco. L'unico problema e' che usando questa classe non vedrete il problema perche' come dicevo lo fa solo quando la chiamo dalla prima finestra cliccando il bottone.. Ditemi voi... Grazie mille.

    codice:
    import javax.swing.*;
    import javax.swing.border.Border;
    
    import java.awt.*;
    import java.util.*;
    
    public class Finestra extends JFrame
    {
     JButton indietro=new JButton("Indietro");
     JPanel p=new JPanel();
     JPanel s=new JPanel();
     JScrollPane scrollesterno;
     
     
     public Finestra()
     {
         super("Lista Discipline");
         Container c=this.getContentPane();
         JLabel listaIcone[]=new JLabel[3];
         JLabel costi[]=new JLabel[3];
         JTextArea areedescr[]=new JTextArea[3];
         JTextArea areetest[]=new JTextArea[3];
         Border border = BorderFactory.createLineBorder(Color.BLACK);
         JPanel sp[]=new JPanel[3];
         JPanel st[]=new JPanel[3];
         JPanel sez[]=new JPanel[3];
         int i,j,k,w;
         
         //Carico tutti i componenti, lo faccio solo con 3
             listaIcone[0]=new JLabel(new ImageIcon("Percorso immagine Atletica Leggera"));
             areedescr[0]=new JTextArea("DESCRIZIONE: L'atletica leggera � un insieme di discipline suddivise in: corse su pista e concorsi (lanci, salti in elevazione e salti in estensione). Le corse su pista  includono percorsi con o senza ostacoli, i lanci si dividono in lancio del peso, del disco, del martello e del giavellotto mentre i salti in salto con l�asta, in lungo, in alto e triplo.");
             areedescr[0].setLineWrap(true);
             areedescr[0].setBorder(border);
             areedescr[0].setEditable(false);
             areetest[0]=new JTextArea("Testimonianze: ANDREA: La pista di atletica di questo centro sportivo � qualcosa di sensazionale: davvero ben fatta. Complimenti anche agli istruttori, professionisti di alto livello che sono sempre pronti ad insegnare e a dare una mano. Sicuramente uno dei miglior centri di atletica leggera in circolazione!");
             areetest[0].setBorder(border);
             areetest[0].setLineWrap(true);
             areetest[0].setEditable(false);
             costi[0]=new JLabel("                             Il costo mensile � di � 20�)");
             
             listaIcone[1]=new JLabel(new ImageIcon("Percorso immagine Calcio"));
             areedescr[1]=new JTextArea("DESCRIZIONE: Il calcio � uno sport di squadra, praticato con un pallone su un campo di gioco rettangolare, con due porte, da due squadre composte da 11 giocatori. L'obiettivo del gioco � quello di segnare pi� punti della squadra avversaria, facendo passare il pallone fra i pali della porta avversaria entro due tempi da 45 minuti. La partita di calcio � controllata da un arbitro con piena autorit� di far rispettare le Regole del Gioco, le cui decisioni sono definitive. � uno sport fisico e tecnico e, praticato a livello professionale, ha un rilevante aspetto tattico. ");
             areedescr[1].setLineWrap(true);
             areedescr[1].setBorder(border);
             areedescr[1].setEditable(false);
             areetest[1]=new JTextArea("Testimonianze: LUCA: Ho sempre avuto una passione grandissima per il calcio e proprio per questo motivo vi ho giocato fin da bambino. Di conseguenza ho avuto modo di sperimentare vari centri sportivi e devo dire che questo mi ha lasciato davvero senza parole. L�efficienza di questo centro � superlativa: palloni sempre gonfi e ottimali per il gioco, campo sempre verde, curato e tosato regolarmente, privo di zolle o buche che possono portare i giocatori ad infortuni. Allenatore, arbitri e personale tutto eccellente. Super consigliato!");
             areetest[1].setBorder(border);
             areetest[1].setLineWrap(true);
             areetest[1].setEditable(false);
             costi[1]=new JLabel("                             Il costo mensile � di � 25�)");
             
             listaIcone[2]=new JLabel(new ImageIcon("Percorso immagine Equitazione"));
             areedescr[2]=new JTextArea("DESCRIZIONE: Il termine equitazione indica l'utilizzo sportivo del cavallo da parte dell'uomo. I cavalli creano uno stretto rapporto con i loro cavalieri e con essi si cimentano in diverse prove come ad esempio il percorso completo,, il cross-country o il salto ad ostacoli.");
             areedescr[2].setLineWrap(true);
             areedescr[2].setBorder(border);
             areedescr[2].setEditable(false);
             areetest[2]=new JTextArea("LUCIA: Quando ho scoperto che presso questo centro sportivo era possibile praticare l�equitazione, mi sono iscritta immediatamente e devo dire che ne sono davvero felice, sport emozionante!");
             areetest[2].setBorder(border);
             areetest[2].setLineWrap(true);
             areetest[2].setEditable(false);
             costi[2]=new JLabel("                             Il costo mensile � di � 30�");
         
         p.setLayout(new GridLayout(3,1,0,80));
         
         sp[0]=new JPanel(new GridLayout(1,2,20,20));
         st[0]=new JPanel(new GridLayout(1,2,20,20));
         sp[0].add(listaIcone[0]);
         sp[0].add(areedescr[0]);
         st[0].add(areetest[0]);
         st[0].add(costi[0]);
         
         sp[1]=new JPanel(new GridLayout(1,2,20,20));
         st[1]=new JPanel(new GridLayout(1,2,20,20));
         sp[1].add(listaIcone[1]);
         sp[1].add(areedescr[1]);
         st[1].add(areetest[1]);
         st[1].add(costi[1]);
         
         sp[2]=new JPanel(new GridLayout(1,2,20,20));
         st[2]=new JPanel(new GridLayout(1,2,20,20));
         sp[2].add(listaIcone[2]);
         sp[2].add(areedescr[2]);
         st[2].add(areetest[2]);
         st[2].add(costi[2]);
         
         sez[0]=new JPanel();
         BoxLayout boxsez0=new BoxLayout(sez[0],BoxLayout.Y_AXIS);
         sez[0].setLayout(boxsez0);
         sez[0].add(sp[0]);
         sez[0].add(st[0]);
         
         sez[1]=new JPanel();
         BoxLayout boxsez1=new BoxLayout(sez[1],BoxLayout.Y_AXIS);
         sez[1].setLayout(boxsez1);
         sez[1].add(sp[1]);
         sez[1].add(st[1]);
         
         sez[2]=new JPanel();
         BoxLayout boxsez2=new BoxLayout(sez[2],BoxLayout.Y_AXIS);
         sez[2].setLayout(boxsez2);
         sez[2].add(sp[2]);
         sez[2].add(st[2]);
         
         p.add(sez[0]);
         p.add(sez[1]);
         p.add(sez[2]);
        
         
         s.setLayout(new BorderLayout());
         s.add(indietro, BorderLayout.NORTH);
         s.add(p,BorderLayout.CENTER);
         
         
    
         scrollesterno = new JScrollPane(s);
         scrollesterno.getVerticalScrollBar().setUnitIncrement(7);
         c.add(scrollesterno);
         
         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
         this.setSize(700,484);
         this.setLocation(300,150);
         this.setVisible(true);
         this.setResizable(false);
     }
    }

    Queste le foto che potete inserire:


    Ultima modifica di raissa95; 12-12-2016 a 17:32

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Però senza le altre classi è comunque impossibile riprodurre il problema ! Lo scopo era proprio riuscire a seguire passo passo le tue operazioni... Puoi mettere in un unico file tutte le tue classi, semplificate al massimo, quindi anche il codice per passare da una finestra all'altra?

    Bene intanto che hai reso compilabile Finestra, ma comunque non serviva rimuovere quel ciclo, così sei costretto a ripetere tutto il codice
    Se non puoi prendere la lista dal database ti conviene creare quella tua listaDiscipline all'inizio del codice, passando per ogni elemento la testimonianza, descrizione, immagine etc... Poi il ciclo lo puoi usare allo stesso modo, cambia solo il modo in cui ti arriva la lista.

    Ci sono molte cose che non vanno nel tuo codice, ma non sono in gran parte collegate al tuo problema.
    Alcuni problemi di visualizzazione possono in genere essere causati dal fatto che il frame viene modificato dopo che viene reso visibile, l'istruzione setVisible(true) dovrebbe essere l'ultima operazione fatta sul frame.
    Nel tuo caso però non vedo aggiunte di componenti fatte dopo, il solo fatto di chiamare setResizable non dovrebbe influire.
    Altra questione: chi rende visibile il frame? Generalmente questa operazione dovrebbe essere fatta all'interno dell' EDT, che è il thread dove dovrebbero essere richiamate tutte le istruzioni correlate al tuo frame e ai suoi componenti. Ma ancora una volta non credo che questo possa determinare il problema ...
    Inoltre sarebbe preferibile lasciare che sia il frame a dimensionarsi correttamente (con il metodo pack()), piuttosto che settare manualmente la dimensione.

    Questi sono alcuni punti salienti, ma è difficile stabilire la causa del problema con solo queste informazioni a disposizione.

    Riesci intanto a fare uno screenshot che riesca a catturare il bug? E sarebbe molto utile come dicevo all'inizio avere tutto a disposizione, ovviamente semplificato al massimo, tutto quello che non ti sembra importante prova a toglierlo (sempre che il comportamento sia sempre lo stesso).

    Al resto del codice (vedo molte cose "barbare") si può pensare in un secondo momento

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    31
    Salve ragazzi, chiedo scusa se sono sparita ma ho davvero avuto molti problemi. Sto ultimando il mio progetto, mi manca pochissimo e subito dopo mi dedicherò a questi dettagli grafici, per cui scriverò nei prossimi giorni... Grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    31
    Eccomi. Allora come hai detto tu, ho caricato i componenti all'inizio e li ho passati al mio array listaDiscipline e ho lasciato tutti i cicli for. Ho caricato tutte le classi in un file txt e ho tolto i package. La classe Main, apre la classe PrimaFinestra, che ho semplificato al massimo, togliendo fronzoli, immagini ecc... Ci sono rimasti solo 3 pulsanti, di cui 2 senza listeners perch� non ci interessano. Il pulsante "Discipline" di PrimaFinestra1 apre la nostra finestra incriminata che sarebbe ListaDisciplina1.
    Non ho aperto ListaDisciplina1 direttamente dal main perch� se la apro dal main funziona, se la apro dopo aver cliccato su "Discipline" di PrimaFinestra d� il problema con lo scrollpane che non parte dall'inizio ma dalla parte di sotto. Le foto io ce le ho in una cartella che si trova nel package delle finestre, inserite le immagini che volete, � solo per prova... Se vi servono ve le posto.
    La classe Ascoltatore collega le due classi.
    Classi.txt

    Grazie infinite

    EDIT: Ho riallegato il file, avevo commesso degli errori
    Ultima modifica di raissa95; 08-01-2017 a 18:10

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    31
    Quando tento di caricare il file Classi.java mi dice "file non valido".
    Inoltre non so come compilarlo un unico file per vedere se funziona.
    Credo che inviarti il progetto in formato zip sia meglio (Ovviamente progetto si fa per dire, ho lasciato solo le 5 classi, non è il progetto completo)

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ok il progetto va bene, io in generale andrei meglio con un file singolo anche perché così non serve fare il download e si ha tutto sotto mano.
    Al massimo se non riesci a caricare un .java cambia l'estensione in .txt ma mantieni la stessa struttura che dicevo.


    A me comunque il problema "si risolve" se inserisco l'istruzione che ti dicevo dentro all' invokeLater () di SwingUtilities.
    In pratica nella classe Disciplina1, alla fine del costruttore, modifichi le due righe seguenti :


    codice:
    scrollesterno.getVerticalScrollBar().setUnitIncrement(7);
    c.add(scrollesterno);

    In queste :


    codice:
    scrollesterno.getVerticalScrollBar().setUnitIncrement(7);
    SwingUtilities.invokeLater (new Runnable () {
            public void run () {
                scrollesterno.getViewport().setViewPosition(new Point(0, 0));
            }
         });
    c.add(scrollesterno);

    In Swing tutte le azioni che coinvolgono o modificano l'interfaccia dovrebbero avvenire all'interno di un unico thread a questo deputato, detto Event Dispatch Thread (EDT).
    In teoria il problema è più a monte, nel senso che è proprio tutta l'inizializzazione dell'applicazione che dovrebbe essere fatta in questo modo, questa è solo una toppa temporanea.


    Se ti interessa approfondire potresti iniziare con il tutorial ufficiale, qui trovi il link alla seconda pagina che mostra già un esempio di uso dell' invokeLater(), ma io mi darei anche una letta all'introduzione. Poi c'è ancora tanto da migliorare qua e là
    Ultima modifica di Ansharja; 08-01-2017 a 23:19

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    31
    Grazie mille, hai risolto il mio problema, sono molto felice, ora funziona
    Mi spiegheresti meglio quelle due righe di codice "magiche" che hai scritto? Non ho ben capito cosa hai fatto. Io avevo solo scritto

    codice HTML:
    scrollesterno.getViewport().setViewPosition(new Point(0, 0))
    ma non funzionava, cosa sarebbe quest'altro pezzo?
    codice HTML:
    SwingUtilities.invokeLater (new Runnable () {
            public void run ()
    Per quanto riguarda il tutorial, domani mattina me lo leggo, grazie anche per quello!
    Sei stato gentilissimo e disponibilissimo

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    In Swing tutte le azioni che coinvolgono o modificano l'interfaccia dovrebbero avvenire all'interno di un unico thread a questo deputato, detto Event Dispatch Thread (EDT).In teoria il problema è più a monte, nel senso che è proprio tutta l'inizializzazione dell'applicazione che dovrebbe essere fatta in questo modo, questa è solo una toppa temporanea.
    Questa era una prima piccola spiegazione alle righe "magiche" che ho inserito .

    Dipende appunto dal fatto che attraverso l'uso di invokeLater sei sicura che l'azione venga eseguita nel contesto dell'EDT, dove dovrebbero essere eseguite le istruzioni relative alla modifica dell'interfaccia.
    Ma questo dovrebbe appunto avvenire in generale, quello non è il modo migliore di risolvere la cosa.

    Il tutorial che ti ho linkato è comunque relativo a questo argomento, prova intanto a leggere questo o a cercare in generale domande e risposte relativi all' EDT, ne troverai anche in italiano immagino (ma parti dal tutorial che è la "risorsa ufficiale").

    Ci sarebbero poi anche altre cose che potresti già guardarti, se hai voglia si può approfondire. Sia pratiche relative al design, che comunque migliora con il tempo e l'esperienza (io in due anni ho fatto qualche passo avanti ma sono ancora alle prime armi rispetto agli utenti saggi del forum ), sia di altre buone pratiche da considerare e alcune meno buone da evitare.

    Ma potrebbe anche interessarti il rendere l'applicazione un po' più gradevole dal punto di vista estetico, con l'uso dei LookAndFeel (non è solo una questione estetica in realtà, un utente apprezzerà in genere il fatto di trovare i componenti come pulsanti e checkbox ma anche i font simili a quelli a cui è abituato).Si può ad esempio settare il LookAndFeel in modo che sia quasi identico a quello del sistema operativo, o scegliere tra altri (sempre se disponibili).Io ad esempio trovo il Metal (quello impostato di default) orrendo dal punto di vista estetico, poi è questione di gusti
    Ultima modifica di Ansharja; 09-01-2017 a 00:43

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 © 2026 vBulletin Solutions, Inc. All rights reserved.