PDA

View Full Version : [JAVA] Ridimensionamento testo JLabel


franksisca
26-11-2006, 11:35
come faccio il ridimensionamento automatico???

non ho le api e non posso scaricarle, e sto usando textpad :rolleyes: :rolleyes:

MEMon
26-11-2006, 11:59
Ridimensionare in base a cosa? Alla grandezza della finestra che la contiene?

franksisca
26-11-2006, 12:03
in effetti sono stato poco chiaro:D:D:D

praticamente nel frame ho 3 bottoni e 2 jlabel, il frame è ridimensionabile, perciò, se lo rendo troppo stretto, la scritta scompare e appaiono i fatidici puntini;)

ecco, io vorrei, che al ridimensionamento del frame si ridimensionasse anche il testo all'interno della jlabel.

a proposito, il setBackground, funziona???

MEMon
26-11-2006, 12:03
comunque guarda questo è un pezzo di codice che avevo scritto tempo fa per ridimensionare in automatico il testo di un Jbutton, vedi se ti può essere utile...
protected void paintComponent(Graphics g){
super.paintComponent(antialiasTesto(g));
width=((Container)getTopLevelAncestor()).getWidth();
if(rid){
if(size!=width){
for(int i=0;i<arrayFont.length;i++){
arrayFont[i]=arrayFont[i].deriveFont((width/(w+0.0f))*fontSize[i]);
}
setFont(arrayFont[0]);
}
}
size=width;
}

franksisca
26-11-2006, 12:07
a proprio in brutal force mode:D:D:D:D


aspetto se esiste qualcosa di meno brutale, altrimenti lo adatto, comunque grazie mille;)

MEMon
26-11-2006, 12:08
per chiarezza:
arrayFont[i]=arrayFont[i].deriveFont((width/(w+0.0f))*fontSize[i]);
arrayFont l'ho usato solo perchè a me servivano più font, altrimenti devi lavorare ovviamente sul font che stai usando e basta, w è la dimensione che vorresti avesse alla dimensione di partenza, cioè subito il tuo frame è largo 500 e vorresti la jlabel grande tot, ecco w è quel tot.

MEMon
26-11-2006, 12:08
a proprio in brutal force mode:D:D:D:D


aspetto se esiste qualcosa di meno brutale, altrimenti lo adatto, comunque grazie mille;)
eh si :D

franksisca
27-11-2006, 10:35
up

PGI-Bis
27-11-2006, 14:53
Puoi determinare una corrispondenza tra le dimensioni di un font e la larghezza di una stringa in pixel e poi usare quella corrispondenza per stabilire la dimensione migliore del font.

/** ComponentAdapter per un'etichetta JLabel: adatta
le dimensioni del font alla larghezza dell'etichetta */
public class FontAdapter extends ComponentAdapter {
private double pixPoint = 0;

/** Invocato quando il componente bersaglio sia
ridimensionato. */
public void componentResized(ComponentEvent e) {
JLabel label = (JLabel)e.getComponent();
if(pixPoint == 0) {
computePixPoint(label);
}
Insets margin = label.getInsets();
int width = label.getWidth() - (margin.left + margin.right);
Font font = label.getFont().deriveFont((float)getBestFontSize(width));
label.setFont(font);
}

/** Calcola la dimensione ideale del font affinchè la stringa
precomputata stia nello spazio width */
private int getBestFontSize(int width) {
return (int)(pixPoint * width);
}

/** Calcola la corrispondenza pixel-punto per la stringa, il font
e in contesto grafico dell'etichetta in argomento. */
private void computePixPoint(JLabel label) {
Font font = label.getFont();
FontRenderContext ctx = ((Graphics2D)label.getGraphics()).getFontRenderContext();
String text = label.getText();
double stringWidth = font.getStringBounds(text, ctx).getWidth();
stringWidth += font.getStringBounds("w", ctx).getWidth();
pixPoint = font.getSize() / stringWidth;
}
}

Il codice qui sopra non tiene conto, per semplicità, dello spazio verticale disponibile all'etichetta.

Sarebbe di gran lunga preferibile non appoggiarsi a JLabel ma creare un component ad hoc. Ciò che il codice qui sopra fa, infatti, è interferire con l'effetto risultante dall'applicazione dell'algoritmo che determina quando il testo di una JLabel debba essere sostituito dai puntini (nella fattispecie, ne impedisci i presupposti di applicabilità). Tale algoritmo, tuttavia, non appartiene al contratto di JLabel dunque l'interazione con esso si basa su asserti di cui non v'è garanzia. La cosa è evidente nell'enunciato:

stringWidth += font.getStringBounds("w", ctx).getWidth();

Qui aumento arbitrariamente la dimensione del testo di un valore pari al carattere presumibilmente più largo (w) presupponendo che se un certo testo aumentato della dimensione del più largo dei caratteri disponibili rientra nello spazio orizzontale disponibile allora il testo non incrementato sarà certamente proiettato dall'etichetta senza sostituzione in "...".

Insomma, occhio :D.