JList com efeito no item da lista

Olá pessoal !

Estou na dúvida e não consigo nem sequer encontrar um exemplo na NET.

Eu precisava de um exemplo de ter fazer com que algum item da JList pisque … como se estivesse chegado alguma mensagem para o usuário daquela lista e ficar Piscando o item…
pode ser o BackGround mudando de cor, ou alguma imagem piscando no item…
o que for baseado nisso será muito bem vindo para ajudar.

Valeu :smiley:

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”.

Muito obrigado Marco, funcionou!!!

Você sabe também como que em cada item posso colocar uma Imagem e uma label nessa JList ?
por exemplo:
[img] - Fulano
[img] - Ciclano
[img] - Beltrano

Abraços

Você precisará definir um ListCellRenderer para seu JList:

list.setCellRenderer(new DefaultListCellRenderer() {               
	private static final long serialVersionUID = 1L;               
                                                                   
	@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.

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;
	}

}

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é ?