Le cose stanno in questo modo:
avevo bisogno di una classe che estendesse la classe standard dei pulsanti in modo che, oltre al normale pulsante:
- 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;
Allo scopo ho definito una classe chiamata
BottoneGUI;
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
Java:
BottoneGUI bg = new BottoneGUI(BottoneGUI.TipoBottone.RICERCA);
viene
- 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
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:
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