Categorie j2se

Usiamo la System Tray in Java 0

ott5
SystemTray

E’ ormai molto di moda mostrare sulla SystemTray del nostro sistema operativo un’icona della nostra applicazione, magari con qualche simpatica opzione o magari solo quando l’applicazione è minimizzata.

Vediamo come questo può essere fatto utilizzando la classe SystemTray della libreria AWT presente dalla versione 6 di Java.

La classe SystemTray rappresenta la barra delle applicazioni della nostra scrivania. Questo concetto varia leggermente a seconda del sistema operativo che utilizziamo: su Microsoft Windows si riferisce alla “Taskbar Status Area”, su Gnome si intende “Notification Area”, su KDE è la “System Tray”.

Su alcuni sistemi operativi, o più genericamente dovremmo parlare di desktop environment, la System Tray potrebbe non esistere o non essere supportata in questo caso quando cercheremo di ottenere l’istanza dell SystemTray con il metodo getSystemTray() verrà sollevata l’eccezione UnsupportedOperationException.
Per testare se la barra è supportata basterà utilizzare il metodo isSupported().

La SystemTray può contenere più icone TrayIcon, aggiunt con il metodo add(java.awt.TrayIcon), e eliminate quando non più utili con remove(java.awt.TrayIcon). La classe TrayIcon consiste in un’immagine, un menù a popup e un insieme di listeners ad esso associati.

Vediamo come può essere utilizzata con un semplice esempio

/**
 *
 * @author Marco Fracassi
 */
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

public class UsingSysTray {

    public static void main(String[] args) throws Exception {

        if (!SystemTray.isSupported()) {
            System.out.println("La SystemTray non è supportata");
            return;
        }

        SystemTray tray = SystemTray.getSystemTray();
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Image image = toolkit.getImage("trayIcon.jpg");

        PopupMenu menu = new PopupMenu();

        MenuItem messageItem = new MenuItem("Mostra messaggio");
        messageItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "www.itcsp.it");
            }
        });
        menu.add(messageItem);

        MenuItem closeItem = new MenuItem("Chiudi");
        closeItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        menu.add(closeItem);

        TrayIcon icon = new TrayIcon(image, "SystemTray itcsp", menu);
        icon.setImageAutoSize(true);
        try {
            tray.add(icon);
        } catch (AWTException e) {
            System.out.println("La TrayIcon non può essere aggiunta");
        }
    }
}

Ordinare delle List in Java 0

lug1

L’ordinamento di una lista è una procedura che viene utilizzata in una marea di applicazioni. Se non volgliamo implementare direttamente un algoritmo di ordinamento (il buon vecchio bubble sort ad esempio), le API di Java ci metono a disposizione la classe di utilità Collections che contiene una serie di metodi statici che operano o ritornano delle Collection.
Il metodo che ci interessa prendere in esame per ordinare una List è il metodo sort che ha due differenti signature:

public static void sort(List list) che ordina una lista in ordine crescente
public static void sort(List list, Comparator c) che ordina la List con la logica specificata dal Comparator.

Comparator è un’interfaccia che presenta solo due metodi:

int compare(Object o1, Object o2) che compara i due oggetti per ordinarli
boolean equals(Object obj) che indica se l’oggetto specificato è uguale al Comparator stesso

Se vogliamo ordinare una lista contenente delle istanze di una nostra classe, sarà sufficiente creare una classe che implementi Comparator e ridefinisca il metodo compare (non ci interesa ridefinire il metodo equals perchè sfrutteremo l’implementazione che ha da Object).

Supponiamo di avere una classe come la segunte:

public class MyClass {

	private int a = 0;
	private int b = 0;

	public MyClass(int a, int b) {
		this.a = a;
		this.b = b;
	}

	public int getA() {
		return this.a;
	}

	public int getB() {
		return this.b;
	}

	public void setA(int a) {
		this.a = a;
	}

	public void setB(int b) {
		this.b = b;
	}

}

Vogliamo ora implementare un comparator che ordini in base alla somma dei due campi a e b di MyClass:

public class MyComparator implements Comparator {

	public int compare(Object obj1, Object obj2) {

			MyClass c1 = (MyClass)obj1;
			MyClass c2 = (MyClass)obj2;

                        int s1 = c1.getA() + c1.getB();
                        int s2 = c2.getA() + c2.getB();

                        return s1 - s2;
                }
        }

}

Per ordinare una List contenente tanti oggetti MyClass sarò sufficiente fare:

List myList = new ArrayList();
myList.put( new MyClass(5,7) );
myList.put( new MyClass(1,1) );
myList.put( new MyClass(2,0) );
myList.put( new MyClass(7,9) );

Collections.sort( myList, new MyComparator() );

Se si tenta di ordinare una List che contiene oggetti di tipo diverso da MyClass verrà generata una eccezione ClassCastException.

IT c.s.p. usa una versione modificata di FREEmium Theme.
Politiche sulla privacy - Copyright