Ibernato
Utente Èlite
- Messaggi
- 4,342
- Reazioni
- 2,049
- Punteggio
- 133
Prova a leggere anche questo thread https://stackoverflow.com/questions/26328040/intellij-idea-getclass-getresource-return-nullLe cose stanno in questo modo:
avevo bisogno di una classe che estendesse la classe standard dei pulsanti in modo che, oltre al normale pulsante:
Allo scopo ho definito una classe chiamata BottoneGUI;
- venisse associato automaticamente il testo del pulsante stesso (per esempio "Search")
- venisse associato automaticamente un tooltip (la "nuvoletta" che descrive la funzione di un bottone quando il mouse lo sorvola)
- un'immagine;
dentro tale classe c'è una enumerazione che descrive il tipo di bottone. Il codice dell'enumerazione è il seguente:
Java:// tipo di bottone enum TipoBottone { RICERCA("Search","Search (cerca)","search.png"), AGGIUNGI("Add","Add component (aggiungi componente)","add.png"), DESELEZIONA("Deselect","Deselect row (deseleziona riga)","remove-selection.png"); private final String tipo; // Search, add ecc. private final String trad; // tooltip private final String icon; // icona PNG // directory delle immagini usate nella GUI private static final String imgDir = "/img/bottoni/"; /** * Costruttore di TipoBottone. * * @param t il tipo * @param u la traduzione in italiano di <tt>t</tt> * @param i il nome dell'icona */ private TipoBottone(String t, String u, String i){ tipo = t; trad = u; icon = i; } /** * @return il tipo (RICERCA ecc.) */ public String getTipo(){ return tipo; } /** * @return un tooltip da associare ad un bottone */ public String getToolTip(){ return trad; } /** Ricava il percorso di directory dell'icona del bottone. * * @return una stringa con il percorso di directory dell'icona di questo bottone */ public String getIconPath(){ StringBuilder sb = new StringBuilder(imgDir); sb.append(icon); // icona return sb.toString(); } // FINE metodo getIconPath } // FINE enum TipoBottone
Come vedete dentro l'enumerazione c'è una stringa imgDir dove è memorizzato il percorso assoluto dell'icona;
riferendomi a questa parte: RICERCA("Search","Search (cerca)","search.png")
in parole povere, si crea questo nuovo tipo di bottone con
vieneJava:BottoneGUI bg = new BottoneGUI(BottoneGUI.TipoBottone.RICERCA);
Ragionando a posteriori mi rendo conto che ho fatto una pessima gestione delle immagini mettendo i percorsi in stringhe, quindi dovrò riscrivere parecchio codice, ma per controllarlo dovrò prima capire come recuperare le immagini. Il codice completo della classe BottoneGUI è il seguente:
- creato un bottone "Search" (è la prima stringa della costante che vedete nell'enumerazione) --> funziona
- associato il tooltip Search (cerca)" (è la seconda stringa nella definizione dell'enumerazione) --> funziona
- idealmente messa l'immagine search.png (la terza stringa nell'enumerazione), che dovrebbe essere prelevata dal percorso /img/bottoni/search.png --> è questo che non funziona, e la causa ora capisco che è il metodo che ho usato
Java:package blam; import javafx.scene.control.Button; import javafx.scene.control.Tooltip; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.text.Font; import javafx.scene.text.FontPosture; import javafx.scene.text.FontWeight; import javafx.util.Duration; public class BottoneGUI extends Button { // tipo di bottone enum TipoBottone { RICERCA("Search","Search (cerca)","search.png"), AGGIUNGI("Add","Add component (aggiungi componente)","add.png"), DESELEZIONA("Deselect","Deselect row (deseleziona riga)","remove-selection.png"); private final String tipo; // Cerca, aggiungi ecc private final String trad; // tooltip private final String icon; // icona PNG // directory delle immagini usate nella GUI private static final String imgDir = "/img/bottoni/"; /** * Costruttore di TipoBottone. * * @param t il tipo * @param u la traduzione in italiano di <tt>t</tt> * @param i il nome dell'icona */ private TipoBottone(String t, String u, String i){ tipo = t; trad = u; icon = i; } /** * @return il tipo (RICERCA ecc.) */ public String getTipo(){ return tipo; } /** * @return un tooltip da associare ad un bottone */ public String getToolTip(){ return trad; } /** Ricava il percorso di directory dell'icona del bottone. * * @return una stringa con il percorso di directory dell'icona di questo bottone */ public String getIconPath(){ StringBuilder sb = new StringBuilder(imgDir); sb.append(icon); // icona return sb.toString(); } // FINE metodo getIconPath } // FINE enum TipoBottone private static final double buttonH = 24.0; // caratteristiche pulsante private static final String family = "Verdana"; private static final double size = 12.0; private static final FontWeight fw = FontWeight.SEMI_BOLD; private static final FontPosture fp = FontPosture.REGULAR; private static final Font f = Font.font(family, fw, fp, size); // font per tooltip private static final Font fDesc = Font.font("Verdana", FontWeight.MEDIUM, 12); private Image img; private ImageView imgv; public BottoneGUI(TipoBottone tb){ super(); setFont(f); try { img = new Image(getClass().getResourceAsStream(tb.getIconPath())); imgv = new ImageView(img); imgv.setFitWidth(buttonH); // ridimensiona secondo la base prefissata imgv.setPreserveRatio(true); imgv.setSmooth(true); imgv.setCache(true); setGraphic(imgv); } catch (NullPointerException ex) { // immagine non trovata //setText(testo); } setText(tb.getTipo()); Tooltip ttip = new Tooltip(tb.getToolTip()); ttip.setFont(fDesc); ttip.setShowDelay(Duration.seconds(0.2)); // dopo quanto tempo in secondi appare il tooltip setTooltip(ttip); } // FINE costruttore } // FINE BottoneGUI
