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

    Aggiungere testo sovrapposto ad una immagine

    Salve, sono abbastanza niubbo per cui chiedo scusa in anticipo.

    Avrei questo bisogno di un aiuto su questo tema: data una immagine (ImageIcon), avrei bisogno di creare un metodo che sovrapponga al centro di questa immagine una String, tipo

    public ImageIcon imgConStirng {ImageIcon immagine, String stringa) {

    // costrutto
    return immagineConStringa;
    }

    Grazie mille
    Ultima modifica di NonnoFausto; 12-07-2017 a 13:21 Motivo: testo incompleto

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da NonnoFausto Visualizza il messaggio
    Avrei questo bisogno di un aiuto su questo tema: data una immagine (ImageIcon), avrei bisogno di creare un metodo che sovrapponga al centro di questa immagine una String, tipo

    public ImageIcon imgConStirng {ImageIcon immagine, String stringa) {
    Innanzitutto, come premessa, un ImageIcon è una implementazione di Icon che "incapsula" solamente un java.awt.Image. Nè più né meno.

    Ora: quale è la image, cioè è stata creata o caricata come? Se hai usato ImageIcon per caricare la immagine (da file/url) o comunque usando il Toolkit di AWT, sappi che la immagine di fatto è a "sola lettura". Quindi non è quella immagine che puoi modificare direttamente.

    Pertanto dovrai creare un BufferedImage, ottenere il suo Graphics2D e a quel punto puoi disegnarci quello che vuoi (line, cerchi, testi, immagini ...). Sul BufferedImage dovrai fare sicuramente due cose:
    1) Disegnare l'immagine originale (dal ImageIcon)
    2) Disegnare la scritta.

    P.S. importante: alla fine di tutti i disegni, va fatto il dispose() sul Graphics2D.


    Se hai dubbi, chiedi.
    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
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    L'immagine deve essere mostrata in una qualche applicazione desktop sviluppata con swing? Visto che parli di ImageIcon ...

    Se è questo il caso potresti anche evitare di voler creare una nuova ImageIcon con la stringa sovrapposta e centrata, ma potresti ad esempio settare l'immagine come sfondo di un pannello (JPanel) e aggiungere al pannello una JLabel con il testo desiderato.
    In questo modo, utilizzando un layout appropriato, la centratura della label sarebbe fatta in automatico, sempre che il testo non sia troppo lungo per essere contenuto all'interno dell'immagine, nel qual caso ci sarebbe da lavorare un po'.

    Altrimenti, se vuoi ottenere una ImageIcon con il testo sovrapposto all'immagine, puoi prenderti l'immagine dell'icona (ma a questo punto , se l'ImageIcon la costruisci a partire ad es. da una BufferedImage, fai un giro inutile, ti conviene agire direttamente sulla BufferedImage) e scriverci la stringa sopra a mano con il metodo drawString () di Graphics.

    Il problema è che devi fare tu un po' di calcoli per sapere la lunghezza/altezza della stringa (a seconda del font che vuoi usare) e dell'immagine per poterla centrare opportunamente nella stringa.

    Aggiungi qualche informazione
    Ultima modifica di Ansharja; 12-07-2017 a 14:35

  4. #4
    Grazie, gentilissimi.
    Il consiglio di adbin mi è stato chiaro e utile.
    In effetti, sto elaborando un'applicazione con swing, ed esattamente ad un pannello ocn una Jtable sulla quale per ogni riga vengono visualizzati dei veri e propri "semafori" che indicano fattibilità o meno di alcuni elementi del record. Per tanto, utilizzo una immagine predefinita del semaforo, e la uso per creare una JLabel che inserisco nella cella della JTable. Mi serviva implementare un metodo che aggiungesse all'immagine che uso la stringa che mi serve, per poi utilizzare l'mmagine ottenuta nella JLabel che vado ad inserire nella cella.
    Spero di essere stato chiaro, comunque penso di aver capito.
    Ancora grazie

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da NonnoFausto Visualizza il messaggio
    una Jtable sulla quale per ogni riga vengono visualizzati dei veri e propri "semafori" che indicano fattibilità o meno di alcuni elementi del record.
    Ma, domanda, quanto sono grandi queste icone? Le righe nelle tabelle tipicamente non sono granché alte. Almeno per default. Poi se uno vuole può anche farle diventare di 60 pixel in altezza, ma va fatto appunto esplicitamente, perché in JTable l'altezza delle righe NON dipende dal contenuto delle celle.

    Quote Originariamente inviata da NonnoFausto Visualizza il messaggio
    utilizzo una immagine predefinita del semaforo, e la uso per creare una JLabel che inserisco nella cella della JTable.
    "Nì", sì e no. Allora: se il getValueAt() del tuo table model fornisce per quella colonna direttamente i tuoi ImageIcon, allora è sufficiente che il table model esponga come Class dal getColumnClass() un Icon.class (o anche più specifico ImageIcon.class) ed è tutto automatico. Non devi preoccuparti di creare JLabel, non devi fare o settare altro.

    Diverso invece sarebbe se il getValueAt() per quella colonna fornisce un valore "logico" es. 0, 1, 2 e tu vuoi che nella cella ci sia un ImageIcon X o Y o Z corrispondente a quel valore. In questo caso dovresti implementare tu un table cell renderer apposito.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ma, domanda, quanto sono grandi queste icone? Le righe nelle tabelle tipicamente non sono granché alte. Almeno per default. Poi se uno vuole può anche farle diventare di 60 pixel in altezza, ma va fatto appunto esplicitamente, perché in JTable l'altezza delle righe NON dipende dal contenuto delle celle.


    "Nì", sì e no. Allora: se il getValueAt() del tuo table model fornisce per quella colonna direttamente i tuoi ImageIcon, allora è sufficiente che il table model esponga come Class dal getColumnClass() un Icon.class (o anche più specifico ImageIcon.class) ed è tutto automatico. Non devi preoccuparti di creare JLabel, non devi fare o settare altro.

    Diverso invece sarebbe se il getValueAt() per quella colonna fornisce un valore "logico" es. 0, 1, 2 e tu vuoi che nella cella ci sia un ImageIcon X o Y o Z corrispondente a quel valore. In questo caso dovresti implementare tu un table cell renderer apposito.
    Grazie,
    la JTable che ho creato funziona sfruttando l'implementazione delle classi DefaultTableCellRenderer e TableCellEditor.
    Non ho problemi a piazzare le immagini/JLabel nella tabella, semplicemente non so gestire l'immagine di partenza che ho inserendole del testo sopra. Le immagini sono tra i 60 e 80 pixels al massimo e rappresentano delle semplici luci di semaforo che può essere verde, giallo o rosso.
    Sto ora provando a lavorare con le classi BufferedImage e Graphic2D, cosa che non ho mai fatto... in giornata vediamo cosa imparo e come me la cavo.

    Grazie ancora



    Ultima modifica di NonnoFausto; 13-07-2017 a 10:59

  7. #7
    ...mmm ancora troppo difficile per me.
    Qualcosa ho creato, ma mi da in output un immagine vuota; aiutato dall'internette, ho partorito questo:
    img = Toolkit.getDefaultToolkit().getImage(Kparameters.g etSemaforo());
    img = img.getScaledInstance(pixels, -1, -1);
    BufferedImage bimage = new BufferedImage(pixels, pixels, BufferedImage.TYPE_INT_ARGB);
    bimage.getGraphics().drawImage(img, 0, 0, null);
    Graphics2D bGr = bimage.createGraphics();
    bGr.drawImage(img, 0, 0, null);
    bGr.dispose();
    bimage.getGraphics().drawString(stringa, pixels/2, pixels/2);
    img = (Image) bimage;

    dove sbaglio?

    Grassie
    Ultima modifica di NonnoFausto; 13-07-2017 a 15:56
    Charlie mi raccomando il pistacchio, eh!

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da NonnoFausto Visualizza il messaggio
    img = img.getScaledInstance(pixels, -1, -1);
    Il 3° parametro è il "hints". -1 non mi pare uno dei valori validi. Vedi documentazione.

    Quote Originariamente inviata da NonnoFausto Visualizza il messaggio
    BufferedImage bimage = new BufferedImage(pixels, pixels, BufferedImage.TYPE_INT_ARGB);
    L'immagine originale è quadrata? Per sicurezza, prendi width/height della immagine SCALATA.

    Quote Originariamente inviata da NonnoFausto Visualizza il messaggio
    bimage.getGraphics().drawImage(img, 0, 0, null);
    Graphics2D bGr = bimage.createGraphics();
    bGr.drawImage(img, 0, 0, null);
    bGr.dispose();
    bimage.getGraphics().drawString(stringa, pixels/2, pixels/2);
    Perché usi più volte getGraphics()/createGraphics() ??
    Usane solo uno (il createGraphics perché dà già un Graphics2D), tieni il Graphics2D in UNA variabile. Usala per disegnare. E alla fine dei disegni fai dispose(). Punto.

    C'è una questione un po' "subdola". Il Toolkit carica le immagini in modo asincrono. Vuol dire che anche se la immagine fosse molto grande, il getImage ritorna quasi subito e poi il caricamento avviene in seguito in modo appunto asincrono.
    Problema: quando fai il drawImage non è certo che la immagine sia completa. Dovresti usare un MediaTracker per attendere il completamento del caricamento.

    P.S. nel drawString il x/y NON è il centro perfetto della stringa. Invece è il punto del "baseline" al primo carattere.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    zuper...
    mi metto subito al lavoro poi darò feedback.
    grz
    Charlie mi raccomando il pistacchio, eh!

  10. #10
    Fatto. Grazie
    Il problema stava proprio nel Toolkit...
    Ho provato a caricare le immagini con ImageIO e funziona tutto.
    Chiudo il thread, grazie tante!
    Charlie mi raccomando il pistacchio, eh!

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.