PDA

View Full Version : JAVA - Pulsante lappeggiante sulla barra delle applicazioni


ilop
29-04-2006, 12:47
Salve a tutti!
Sto creando una chat in Java e mi servirebbe il vostro aiuto per una piccola cosetta dell'interfaccia grafica.
In pratica voglio che quando la finestra della chat è ridotta ad icona, il relativo pulsante sulla barra delle applicazioni deve lappeggiante come succede per MSN Messenger, o se non è possibile farlo lampeggiare, vorrei comunque creare un effetto visivo che attiri l'attenzione.
Chi mi da una mano???

ilop
01-05-2006, 00:50
Possibile che nessuno ne sappia niente!?!?!

PGI-Bis
01-05-2006, 09:35
Assumendo che tu stia usando JDIC, basta sostituire periodicamente l'icona. Ti faccio un esempio per la futura piattaforma Java SE 6, che include JDIC (TrayIcon, SystemTray):

FrameSequence.java
package it.tukano.trayicondemo;

import java.awt.*;

public class FrameSequence {
private Image[] frames;
private int frameIndex;

public FrameSequence(Image...frameImages) {
frames = frameImages;
}

public void reset() {
frameIndex = 0;
}

public void nextFrame() {
frameIndex++;
if(frameIndex == frames.length) {
frameIndex = 0;
}
}


public Image getCurrentFrame() {
return frames[frameIndex];
}
}

TrayIconAnimator.java
package it.tukano.trayicondemo;

import java.awt.event.*;
import java.awt.*;

public class TrayIconAnimator implements ActionListener {
private TrayIcon target;
private FrameSequence frames;
private javax.swing.Timer animator;

public TrayIconAnimator(TrayIcon targetTrayIcon, int frameTime,
FrameSequence frameSequence)
{
target = targetTrayIcon;
frames = frameSequence;
animator = new javax.swing.Timer(frameTime, this);
}

public void start() {
animator.start();
}

public void stop() {
animator.stop();
frames.reset();
target.setImage(frames.getCurrentFrame());
}

public void actionPerformed(ActionEvent e) {
frames.nextFrame();
target.setImage(frames.getCurrentFrame());
}
}

Main.java
package it.tukano.trayicondemo;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class Main implements Runnable, ActionListener {
//Crea e avvia Main se SystemTray è supportato.
public static void main(String...args) {
if(SystemTray.isSupported()) {
startApp(createMain());
} else {
System.err.println("SystemTray not available on this platform");
}
}

/*Main o null, a seconda che il caricamento delle immagini vada o meno
a buon fine*/
private static Main createMain() {
try {
return new Main();
} catch(IOException ex) {
ex.printStackTrace();
System.err.println("Cannot load frame images");
return null;
}
}

/*Avvia il main in argomento usando la coda degli eventi AWT/Swing se main
sia diverso da null*/
private static void startApp(Main main) {
if(main != null) {
SwingUtilities.invokeLater(main);
}
}

private TrayIconAnimator animator;
private TrayIcon trayIcon;

/*Genera una sequenza di immagini, un TrayIcon e un animatore. Associa al
TrayIcon l'ActionListener (this) che causa lo spegnimento della jvm*/
public Main() throws IOException {
FrameSequence seq = new FrameSequence(
ImageIO.read(Main.class.getResource("/icons/frame000.png")),
ImageIO.read(Main.class.getResource("/icons/frame001.png")));
trayIcon = new TrayIcon(seq.getCurrentFrame(), "Java™ Sample");
trayIcon.addActionListener(this);
animator = new TrayIconAnimator(trayIcon, 500, seq);
}

/*Operazioni eseguite dall'AWT Event Dispatcher Thread */
public void run() {
try {
SystemTray.getSystemTray().add(trayIcon);
animator.start();
} catch(AWTException ex) {
ex.printStackTrace();
System.err.println(
"An error occurred while adding icon to SystemTray");
}
}

/*L'attivazione dell'icona provoca lo spegnimento della jvm*/
public void actionPerformed(ActionEvent e) {
animator.stop();
SystemTray.getSystemTray().remove(trayIcon);
}
}

A scanso d'equivoci, JDIC sta per Java Desktop Integration Components, un pacchetto non standard (fino a Java SE 5) che puoi scaricare da qui:

https://jdic.dev.java.net/

Usando Java 5 per compilare il codice su riportato dovrebbe essere sufficiente aggiungere le clausole "import":

import org.jdesktop.jdic.tray.*;

nelle unità Main.java e TrayIconAnimator.java