marcobiscaro2112 3 de fev. de 2010
Veja essa classe:
import java.awt.Color ;
import java.awt.event.ActionEvent ;
import java.awt.event.ActionListener ;
import javax.swing.JList ;
import javax.swing.Timer ;
public class BlinkJList extends JList implements ActionListener {
private static final long serialVersionUID = 1L ;
private boolean blink ;
private boolean blinking ;
private Color blinkColor ;
private Color normalColor ;
public BlinkJList ( boolean isBlinking , Color blinkColor ) {
this . blinking = isBlinking ;
this . blinkColor = blinkColor ;
normalColor = getBackground ();
new Timer ( 500 , this ). start ();
}
public BlinkJList ( boolean isBlinking ) {
this ( isBlinking , Color . RED );
}
public BlinkJList () {
this ( false );
}
public void setBlinkColor ( Color blinkColor ) {
this . blinkColor = blinkColor ;
}
public void setBlinking ( boolean blinking ) {
this . blinking = blinking ;
}
public boolean isBlinking () {
return blinking ;
}
public Color getBlinkColor () {
return blinkColor ;
}
@Override
public void actionPerformed ( ActionEvent e ) {
if ( ! blinking ) {
return ;
}
blink = ! blink ;
updateColor ();
}
private void updateColor () {
if ( blink ) {
setSelectionBackground ( blinkColor );
} else {
setSelectionBackground ( normalColor );
}
}
public void setNormalColor ( Color bg ) {
normalColor = bg ;
}
}
Quando precisar ressaltar um item, selecione-o (com setSelectedIndex) e use o método setBlinking para ativar/desativar o “pisca-pisca”.
marcobiscaro2112 4 de fev. de 2010
Você precisará definir um ListCellRenderer para seu JList:
list . setCellRenderer ( new DefaultListCellRenderer () {
private static final long serialVersionUID = 1 L ;
@Override
public Component getListCellRendererComponent ( JList list ,
Object value , int index , boolean isSelected ,
boolean cellHasFocus ) {
JLabel label = ( JLabel ) super . getListCellRendererComponent (
list , value , index , isSelected , cellHasFocus );
label . setIcon ( seuIcone );
return label ;
}
} );
Isso considerando que seuIcone é um ImageIcon previamente instanciado.
marcobiscaro2112 4 de fev. de 2010
Só melhorando, ao invés de usar o Timer de javax.swing, use o Timer de java.util pois com ele é possível definir a Thread como deamon (para que ela não fique segurando o processo da JVM a toa):
import java.awt.Color ;
import java.util.Timer ;
import java.util.TimerTask ;
import javax.swing.JList ;
public class BlinkJList extends JList {
private static final long serialVersionUID = 1L ;
private boolean blink ;
private boolean blinking ;
private Color blinkColor ;
private Color normalColor ;
public BlinkJList ( boolean isBlinking , Color blinkColor ) {
this . blinking = isBlinking ;
this . blinkColor = blinkColor ;
normalColor = getBackground ();
new Timer ( true ). scheduleAtFixedRate ( new TimerTask () {
@Override
public void run () {
if ( ! blinking ) {
return ;
}
blink = ! blink ;
updateColor ();
}
}, 0 , 500 );
}
public BlinkJList ( boolean isBlinking ) {
this ( isBlinking , Color . RED );
}
public BlinkJList () {
this ( false );
}
public void setBlinkColor ( Color blinkColor ) {
this . blinkColor = blinkColor ;
}
public void setBlinking ( boolean blinking ) {
this . blinking = blinking ;
}
public boolean isBlinking () {
return blinking ;
}
public Color getBlinkColor () {
return blinkColor ;
}
private void updateColor () {
if ( blink ) {
setSelectionBackground ( blinkColor );
} else {
setSelectionBackground ( normalColor );
}
}
public void setNormalColor ( Color bg ) {
normalColor = bg ;
}
}
jhieiy 10 de fev. de 2010
Marco muito obrigado pela ajuda que está me dando… está funcionando bonitinho!
Só um detalhe que enfrento é que no meu caso acontecerá de mais de 1 item piscar ao mesmo tempo.
exemplo
[img] Label 1 ( aciona o evento de alerta )
[img] Label 2
[img] Label 3
[img] Label 4 ( aciona o evento de Alerta )
Acionando 2 itens ou mais utilizando apenas uma vez o setSelectedIndex não iria dar certo né ?