Newsgroup: it.comp.java
Titolo: JLabel con effetto grafico particolare

ho l'esigenza di creare delle label che ogni volta che viene modificato il
testo, cambi il colore di background, ma in modo particolare: partendo
dallo sfondo bianco di default, al cambio del testo deve diventare rosso e
poi nel giro di circa un secondo tornare bianco, mostrando le varie
gradazioni intermedie.
Per fare ciò pensavo di creare un mio componente
estendendo una JLabel, ridefinire il metodo setText per fargli fare ciò che
mi serve. Questo è il codice fondamentale della classe:
import
java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class
JFadingLabel extends JLabel {
  private int fadingSteps = 5;
  private
int interval = 50;
  private Timer timer;
  private int numeroCiclo;
public JFadingLabel() {
    super();
    System.out.println("questa riga
non viene stampata");
  }
  public void setText(String text) {
super.setText( text);
    timer = new Timer(interval, new
ActionListener() {
      public void actionPerformed(ActionEvent e) {
setOpaque(true);
        setBackground(new Color(
calcolaColore(255, 255, fadingSteps, numeroCiclo+1),
calcolaColore(0, 255, fadingSteps, numeroCiclo+1),
calcolaColore(0, 255, fadingSteps, numeroCiclo+1)
                    ));
repaint();
        numeroCiclo++;
      }
    });
    numeroCiclo =
0;
    timer.start();
    do {
			try {
				Thread.sleep(10);
			}
catch (InterruptedException e) {}
    } while (numeroCiclo < fadingSteps);
timer.stop();
  }
  private int calcolaColore(int coloreDa, int
coloreA, 
                     int stepTotali, int stepCorrente) {
double colore = coloreDa - (( ((double)coloreDa -
(double)coloreA) / (double)stepTotali ) 
                    *
(double)stepCorrente);
    return (int)colore;
  }
}
Innanzitutto.....notate qualche errore grossolano??
In secondo luogo, la
cosa sembra funzionare ma c'è un problema: ne ho più di una nello stesso
frame e mi capita di doverle utilizzare contemporaneamente. Facendo qualche
prova però ho visto che il ridisegno (ovvero la fase in cui vengono
cambiati i colori) ne "funziona" solamente una alla volta. Come potrei
risolvere questo problema?
Infine, dichiarando una label come
JFadingLabel lbl = new JFadingLabel() perchè non viene eseguita la out
presente nel costruttore?
Grazie
Lis
--------------------------------
Inviato via 
http://usenet.iol.it

int interval = 50;
Uff...scusate l'allineamento, è "colpa" di
iol....la prossima volta posto da mailgate :-//


presente nel costruttore?
In pratica non entra nel
costruttore e non riesco proprio a comprenderne il motivo. La classe è
definita così
public class JFadingLabel extends JLabel {
 .....
dichiarazioni variabili private
  public JFadingLabel() {
    super();
System.out.println("ppppppppppppppppppppppppppp");
    .....
  }
  ....
}
e dalla mia applicazione creo l'oggetto in questo modo:
  private
JFadingLabel label = new JFadingLabel();
e in seguito imposto varie
proprietà.
Dov'è l'errore? Io non riesco proprio a trovarlo


Dov'è l'errore? Io non riesco proprio a trovarlo
Secondo me, guardi nel posto sbagliato.
Anche facendo girare il codice che avevi postato l'altra volta, a me 
compariva la stampa.
Come esegui la tua classe?
HTH
-- 
Ciao
	Fabrizio C.

Dopo varie prove ho + o - capito perchè non funziona, però non so come
risolvere il problema.
Questa è la mia classe (riporto solo le parti che potrebbero interessare
per sistemare il problema), un oggetto che estende una JLabel:
public class JFadingLabel extends JLabel {
	private Color foregroundColorFrom;
	....[altre variabili simili]
 
	public JFadingLabel() {
		super();
		foregroundColorFrom = getForeground();
	}
	//override della setText della JLabel
	public void setText(String text) {
		fade(); 
		super.setText(text);
	}
	//esegue la sfumatura
	public void fade() {
		if (foregroundColorFrom.equals(foregroundColorTo))  <--- NPEx
			fadeForeground = false;
 
		....resto della procedura
	}
}
In pratica quando creo l'oggetto (con un semplice JFadingLabel label =
new JFadingLabel()), mi ritorna una NullPointerException sulla riga
dell'if nel metodo fade.
Questa è la parte dello stacktree interessata:
java.lang.NullPointerException
	at pid.ddbclient.JFadingLabel.fade(JFadingLabel.java:103)
	at pid.ddbclient.JFadingLabel.setText(JFadingLabel.java:93)
	at javax.swing.JLabel.<init>(JLabel.java:138)
	at javax.swing.JLabel.<init>(JLabel.java:212)
	at pid.ddbclient.JFadingLabel.<init>(JFadingLabel.java:30)
	at pid.ddbclient.FrameSubscribe.<init>(FrameSubscribe.java:34)
 
Seguendo il giro, quando istanzio il mio oggetto richiama il costruttore
JLabel(), che a sua volta chiama JLabel(String text, Icon icon, int
horizontalAlignment), la quale contiene una setText. A questo punto però
richiama la "mia" setText, ma prima ancora di avere eseguito tutte le
inizializzazioni presenti nel mio costruttore JFadingLabel(). Logica e
sacrosanta quindi l'eccezione.
A questo punto però come posso risolvere il problema? Mi è venuto in
mente di usare una variabile booleana che mi indica se l'oggetto è stato
inizializzato oppure no, e in tal caso far "saltare" le istruzioni
incriminate nella setText, però come soluzione non mi sembra un gran
chè.....
Aiutooooooooo, please ;-)
Lis
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 compariva la stampa.
Ho appena scritto un post in cui spiego meglio il problema (ci ho messo
un pň a capirlo... ;-))
Grazie


 at pid.ddbclient.FrameSubscribe.<init>(FrameSubscribe.java:34)
Conseguentemente....

 Conseguentemente....
....???? Che posso fare??  :-)


dei thread separati me le "sfuma" tutte contemporaneamente.
Se provi a eseguire la classe che ti ho mandato (non lo hai fatto, 
vero?), vedi che invece cosě funziona: ho messo due istanze della label 
appositamente per provare il tuo problema ;-)


dell'if nel metodo fade.
Ovvio. Inoltre se accidentalmente avesse funzionato, avresti avuto un 
fade (magari non voluto), anche alla prima visualizzazione :-)
-- 
Ciao
	Fabrizio C.

 appositamente per provare il tuo problema ;-)
Beccato ;-)
Cmq è vero, ho provato e la tua funziona benissimo (a parte che adesso
ho la finestra aperta e non so come chiuderla se non buttando giù la
JVM...).
Adesso allora provo a scoprire perchè la mia "bloccava" il refresh....mi
metto in caccia, ma ho idea che quel Thread.sleep che ho messo sia di
troppo :-)
Grazie 1000


 ragionevolmente.
Ok, ho adottato questa soluzione e tutto è andato a posto, anche se mi
sa che devo studiarmi ancora un pò i costruttori e i loro meccanismi
:-//
Grazie


troppo :-)
Direi proprio di sě, non serve perché non devi aspettare niente.
L'uso del Timer č proprio per avere eventi asincroni...


 L'uso del Timer č proprio per avere eventi asincroni...
Infatti.....non so nemmeno perchč l'avessi messo, non centrava proprio
nulla, cosě come il nuovo thread che creavo ogni volta. L'ho riscritta
praticamente da capo e adesso č piů semplice, corta e funziona
perfettamente
Ciao


 ....???? Che posso fare??  :-)
:)
Visto che hai trovato una soluzione, non provo a dartene altre,.... :)))
Cmq sono sempre a disposizione...