Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    drawString a righe e loop infinito, perchè?

    In un mio programma java ho l'esigenza di crearmi un metodo che permetta la scrittura grafica di una stringa, tramite graphics in più righe.
    In pratica devo scrivere (disegnare) una stringa all'interno di un rettangolo, se una parola non entra va a capo..

    Ho creato un mio metodo così fatto:

    codice:
    private void disegnaARighe (Graphics g , Rectangle rect , String scritta) {
            g.setColor(Color.BLACK);
            int l = (int)rect.getWidth();
            String [] parole = scritta.split(" ");
            int tmp = 0;
            int xCorrente = 0;
            int yCorrente = g.getFontMetrics().getHeight();
            while (tmp < parole.length) {
                if (g.getFontMetrics().stringWidth(parole [tmp]) < (l - xCorrente)) {
                    g.drawString (parole [tmp] + " " , rect.x + xCorrente , rect.y + yCorrente);
                    xCorrente += g.getFontMetrics().stringWidth(parole [tmp] + " ");
                    tmp++;
                }else {
                    xCorrente = 0;
                    yCorrente += g.getFontMetrics().getHeight() + 2;
                    continue;
                }
            }
        }
    il parametro 'g' è relativo a un JPanel, ecco quindi spiegato il perchè faccio quelle somme sulla x del disegno.
    Comunque il problema è che ho notato che il metodo va in loop infinito ma non riesco a capire perchè..voi riuscite a trovare l'errore?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da zipangulu Visualizza il messaggio
    ho notato che il metodo va in loop infinito ma non riesco a capire perchè..
    Può andare in loop quando la prima parola (di una riga) è più larga del width possibile.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Può andare in loop quando la prima parola (di una riga) è più larga del width possibile.
    Io ho testato il metodo con una "scritta" di 6 parole (la frase "Ciao mamma guarda come mi diverto") in un rettangolo (Rectangle (100,100,100,100) ) e con Font quello di default..in questo test ho avuto questo comportamento, secondo me, anomalo:
    al primo paint la scritta si vede perfettamente a righe come
    codice:
    ciao mamma
    guarda come mi
    diverto
    poi (vi ho introdotto che stessi lavorando in una GUI di una mia applicazione) ho fatto un click in un'area di un rectangle che faccio funzionare da bottone disegnato, al click in questo bottone viene semplicemente modificato qualche parametro (tipo una variabile intera per la decisione di quale schermata mostrare, qui ci saranno altri piccoli disegni) e poi si richiama il paintImmediately su tutta l'area del JPanel..qui scatta il problema, parte il loop che tramite piccolo debug ho notato fermarsi (per fermarsi intendo il fatto che itera sempre su questo passo, il senso è un po' l'opposto del significato letterale della parola ) sulla "1" parola (per 1 si intende la 2a parola poichè si parte da 0) ma la frase, il rettangolo e il font sono gli stessi del successo di prima..non riesco proprio a capire dove stia il problema!

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Ho capito dove sta l'errore: Andbin ci hai preso in pieno, nella nuova schermata cambio il font (Arial bold a 18) e quindi avviene che ci sia qualche parola ("mamma") che è più lunga del rettangolo..risolverò con qualche accortezza in più
    Grazie!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da zipangulu Visualizza il messaggio
    risolverò con qualche accortezza in più
    Le possibilità sono almeno 2:
    - disegni comunque la parola per intero anche se "sfora" del width massimo possibile (ammesso che ti vada bene come "male minore"). Nota che se non vuoi che si veda la eccedenza fuori dal rettangolo, puoi anche sfruttare il "clipping" sul Graphics. Ovviamente poi non è molto leggibile la frase ma ...... beh, è una scelta.

    oppure

    - aggiungi la logica per spezzare la parola. E qui ci potrebbero essere anche diverse varianti. Nel senso che come caso estremo si può anche arrivare a fare la "sillabazione" seguendo le regole della lingua usata.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.