Introduzione a SwingX

In questo articolo vedremo alcuni nuovi componenti forniti dalla libreria SwingX.

SwingX è una libreria open source che introduce una serie di nuove classi da utilizzare all’interno di applicazioni Java Swing. Alcune di queste classi sono “semplici” miglioramenti di componenti già esistenti (JXTable ad esempio), altre ne implementano di nuovi (JXTaskPane, JXTreeTable…), altre ancora invece aggiungono nuove funzionalità a componenti già esistenti (come l’autocompletamento, evidenziamento al passaggio del mouse, ombre ecc.).

Se volete vedere alcuni di questi componenti in azione andate a questa pagina (in particolare date un’occhiata a questo). Attenzione, per provare le demo bisogna aver installato Java Web Start). Per cominciare scaricate l’ultima release di SwingX dal sito ufficiale (al momento in cui scrivo l’ultima disponibile è la 0.9.3). Fatto questo scompattate lo zip e cercate il file swingx-X.Y.X.jar, per poter usare SwingX nelle nostre applicazioni dovrà essere aggiunto al classpath. Fatto questo possiamo iniziare!

 

JXTaskPane e JXTaskPaneContainer

Se avete usato Windows XP probabilmente vi siete già imbattuti in questo componente (ad esempio nel Pannello di Controllo e nelle Risorse del Computer). JXTaskPane non è altro che un pannello che può il cui contenuto può essere “nascosto” e/o “mostrato” a piacere (basta un click sull’apposito bottoncino). Un’immagine vale più di mille parole:

20080703124412435_1

 

All’interno di questi pannelli è possibile inserire qualsiasi componente (compresi altri pannelli).

 import org.jdesktop.swingx.*;

 ...

 JXTaskPaneContainer taskPaneContainer = 
 new JXTaskPaneContainer(); 

 JXTaskPane normalTaskPane = new JXTaskPane();
 normalTaskPane.setTitle("Titolo!");
 normalTaskPane.add(new JButton("Un bottone!"));

 JXTaskPane specialTaskPane = new JXTaskPane();
 specialTaskPane.setTitle("Questo JXTaskPane e' speciale!");
 specialTaskPane.setSpecial(true);
 specialTaskPane.add(new JTree());
 JXTaskPane collapsedTaskPane = new JXTaskPane();
 collapsedTaskPane.setTitle("JXTaskPane chiuso di default");
 collapsedTaskPane.setCollapsed(true);
 collapsedTaskPane.add(new JTextField("Casella di testo"));
 taskPaneContainer.add(normalTaskPane);
 taskPaneContainer.add(specialTaskPane);
 taskPaneContainer.add(collapsedTaskPane);

 JPanel panel = new JPanel();         
 panel.add(new JScrollPane(taskPaneContainer));

 ...

Vediamo di commentare il codice. Per creare uno di questi pannelli basta instanziare la classe JXTaskPane (al momento esiste un unico costruttore senza parametri). Fatto questo possiamo inserire un titolo usando il metodo setTitle(“titolo”). Volendo possiamo anche rendere un pannello “speciale” (come quello centrale, nell’immagine qui sopra) usando setSpecial(true).

Possiamo “controllare” il pannello con setCollapsed(isCollapsed): passando true il contenuto sarà nascosto, con false invece tornerà visibile. Per far funzionare il JXTaskPane è necessario aggiungerlo ad un container apposito, JXTaskPaneContainer.

 

Autocompletamento

Grazie alla classe AutoCompleteDecorator è possibile aggiungere il completamento automatico a componenti come JTextField, JList e JComboBox. Il funzionamento è veramente semplice. Se vogliamo fornire un JComboBox di autocompletamento è sufficiente crearlo usando un DefaultComboBoxModel a cui è stato passato un array con il contenuto del combobox e passarlo a AutoCompleteDecorator.decorate().

Se invece vogliamo dare l’autocompletamento ad un JTextField dobbiamo usare una versione differente di decorate: il primo parametro è il JTextField, il secondo è una List con le stringhe di completamento mentre l’ultimo è un booleano che indica se l’utente può inserire solo una delle stringhe preparate (true) oppure se può inserirne anche di nuove (false). Ecco un esempio:

 import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;

 ... 

 String[] items = {"http://www.javastaff.com",
 "http://www.apple.com",
 "http://alessandro-cocco.blogspot.com",      "html.it",
 "www.google.it",
 "www.google.com", 
 "www.macupdate.com"
 };

 JTextField textField = new JTextField(20);
 JComboBox comboBox = new JComboBox();
 comboBox.setModel(new DefaultComboBoxModel(items));

 AutoCompleteDecorator.decorate(textField, Arrays.asList(items), 
 false); 
 AutoCompleteDecorator.decorate(comboBox);

 ...

E il risultato del codice è mostrato nella seguente figura

20080703124412435_2

 

 

HighlighterFactory

Grazie ad HighlighterFactory possiamo migliorare con facilità la resa grafica di alcuni componenti come JXList, JXTable e JXTree aggiungendo uno o più Highlighter. Un Highlighter permette (ad esempio) di evidenziare l’elemento puntato dal mouse senza doverlo selezionare. Inoltre possiamo usarlo per alternare i colori delle righe di una tabella o di una lista senza dover ridefinire manualmente il renderer.

Grazie alla classe factory HighlighterFactory è possibile scegliere tra una serie di Highlighter già pronti oppure possiamo definire dei modelli personalizzati.

 import org.jdesktop.swingx.*;
 import org.jdesktop.swingx.decorator.*;

 ...

 JXList rolloverList = new JXList(items);
 rolloverList.setRolloverEnabled(true);
 Highlighter rolloverHighlighter = new ColorHighlighter(
        HighlightPredicate.ROLLOVER_ROW,
        Color.BLACK, Color.WHITE);
 rolloverList.setHighlighters(rolloverHighlighter);

 JXList stripedList = new JXList(items);
 stripedList.setHighlighters(
        HighlighterFactory.createSimpleStriping(Color.GRAY)); 

 JPanel panel = new JPanel(new GridLayout(2, 1, 0, 10));
 panel.add(new JScrollPane(rolloverList));
 panel.add(new JScrollPane(stripedList));

 ...

e il risultato è

20080703124412435_3

Nella lista sopra è stato messo un ColorHighlighter che colora la riga sui cui poggia il mouse, in quella sotto invece è stato impostato un “alternatore di righe”. Come vedete il codice necessario è poco e molto semplice.

Questo è solo un assaggio di quello che SwingX può offrire: al momento la libreria è formata da oltre cinquecento classi suddivise in circa quaranta package. Se siete interessati ad approfondire SwingX potete dare un’occhiata alla javadoc scaricabile insieme alla libreria.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.