5
}
6
});
La lasse Wel omeFrame non ontiene altri elementi rilevanti: il suo
ostrut-tore rea un oggetto Java di tipo JFrame ed vi aggiunge un JPanel oi relativi
JButton, ottenutidall'invo azionedelmetodo reateWel omePanel().
Dalla lasse Wel omeFrame, tramite il bottone Consultare lo stori o delle
s an-sioni si invo a il ostruttore della lasse A quiredItemsTable(), he verrà ora
analizzata.
8.2 La lasse A quiredItemsTable
La lasse A quiredItemsTable() è la lasse preposta alla ostruzione della
ta-bellain uivienemostratol'elen odeido umentis ansionati. Il ostruttoredella
lasse inizializzaun nuovo oggetto di tipo JFrame su ui è denito un layout di
tipoBorderLayout (6.1). In orrispondenza diBorderLayout.CENTER è
posizio-natoilJPanel he ontienelaJTabel, mentrenellasezioneBorderLayout.SOUTH
paginedella tabella.
Il ostruttoredella lasseA quiredItemsTable invo ailmetodo reatePanel(),
he restituis eunoggettoditipoJPanelsu uisono ollo atidue ontainer: uno
di tipo JS rollPane he ontiene l'oggetto JTable ed uno di tipo JPanel on i
bottoni Torna indietro ed Es i.
Il metodo reateTable() è preposto alla reazione della tabella: olora le
ri-ghe, imposta il font ed il olore di ba kground per l'header, entra gli elementi
all'internodelle elle. Per assegnare un oloredisfondo allerighedella tabella,è
stato ne essario sovras rivere il metodo prepareRenderer(TableCellR end erer
t r, int row, int olumn)della lassejavax.swing.JTable he, alrenderer 3
didefaultdelle elle, appli aal uneregoleperfarsi he glisfondirisultinoessere
di olore alternato.
Il metodoshowPages(int itemsPerPage, int urrentPageIndex) hail
om-pito di visualizzare la pagina orrente e gestire i ollegamenti alle altre pagine;
ri hiedeininputil numerodielementiperpaginael'indi edella paginasu ui i
sitrova. Al suo interno vengono ri hiamatidue metodi:
•
JRadioButton reateLinks(int itemsPerPage, int urrent, int target), he è il vero arte e della reazione dei ollegamenti alle singolepagine;
•
il metodo JRadioButton reateRadioButtons(int itemsPerPage, int target, String title), he rea i link alla pagina Pre edente eSu - essiva.
Cias uno dei JRadioButton, reati on uno dei metodi su itati,
implemen-ta a tionPerformed(A tionEven t e) ri hiamando il metodo showPages(int
itemsPerPage, int urrentPageIndex).
All'interno di reateLinks(int itemsPerPage, int urrent, int target)
viene sovras ritto inoltreilmetodovoid fireStateChanged() appartenente
al-la lasse Abstra tButton 4
, he assegna una olorazione diversa a se onda he i
ollegamenti siano abilitati/disabilitati,premuti oselezionati.
Per on luderesitrovailmetodoRowFilter filter(final int itemsPerPage,
final int target): è l'arte e della paginazione della tabella e sovras rive il
metodo boolean in lude (Entry entry) he indi a quali item devono essere
3
Ilrendererpuòesserepensato omeadunoggetto hesio upadellavisualizzazionedegli
aspettigra ideglielementidi una ella
4
visualizzati (in questo spe i o aso, mostra 10 elementi per pagina). Gli
og-getti della lasse RowFilter sono utilizzati proprio per ltrare quegli elementi,
appartenenti a listeod elen hi, he non devono essere visibili. Quando un ltro
di tipo RowFilter è asso iato ad una tabella, tale ltro è appli ato ad
un'inte-rariga(epuòessereindottodaregoledenitesui ontenutidiunaqualsiasi ella).
8.3 Il pa kage desktopApp.table
Nelpa kage it.eproje t.desktopApp.table sonostate ollo atele lassi di
ap-poggio per la ostruzione della tabella. La lasse RadioBttonUI denis e gli
aspetti gra i dei bottoni radio he fungono da ollegamento alle varie pagine:
nello spe i o, tale lasse si preo upa di reare l'eetto sottolineato ai radio
button,quando ilmousepassa soprail bottone(ButtonModel.isRollover()
ri-leva ilpassaggiodel mousesul pulsante).
La lasse CustomModel estende la lasse DefaultTableModel, he a sua volta
implementa l'interfa ia TableModel 5
. Il motivo per ui si è de iso di
estende-re laDefualTableModel è puramenteprati o: anzi hé dover implementaretutti
i metodi dell'interfa ia TableModel, a ui non ero interessato, è risultato più
sempli esovras rivere il ostruttoredella lasseDefualTableModel, inmodo he
questosio upassediinserirenellaJTableidatirelativialles ansionieettuate.
L'a quisizione delle entry da importare nella tabella è fatta da un'istanza della
lasse XMLParser (di ui si analizzerà il ontenuto più avanti nel apitolo,ma si
è già a ennato an he in 6.3), he si o upa di pro essare i le XML di log per
ri avarne informazioni.
All'interno del pa kage it.eproje t.desktopApp.table vi sono poi altre due
lassi: ButtonEditoreButtonRenderer. LaprimaestendeDefaultCellEditor,
he è la lasse di default per la gestione delle elle delle JTable; ButtonEditor
nesovras riveil ostruttoreperfarsì he venga reato,nella olonnadeidettagli,
un bottone (un JChe kBox) a uiaggiungere un listener he risponda ai li del
mouse. Alla ri ezione del li , esso rea un'istanza della lasse ShowDetails, he
realizzaunJFrame heriportaidettaglidellas ansione. ButtonRendererestende
inve e la lasse JButton ed implementa TableCellRenderer, he è l'interfa ia
he denis e imetodi ri hiesti da ias un oggetto he voglia essere inseritonelle
elle di una JTable. Per assegnare un allineamento ( entrato) ed un'i ona (la
lentediingrandimento)aibottonidella olonnaDettagli viene realizzato
quin-5
diil metodogetTableCellRendererCompo nent .
8.4 La lasse Sele tDo sType
Qualora alla prima s hermata si fosse s elto di S ansionare un do umento,
il software avrebbe oinvolto la lasse Sele tDo sType ed a seguire la lasse
ImageEditor, he èdi fatto uore delprogramma.
La lasse Sele tDo sType è parti olarmente interessante per hé fa uso della
li-breriaCookSwing,di uisièparlatoin6.2e6.2.2. Il ostruttore reaun'oggettodi
tipoCookSwing he esegue ilrender delleDo sType.xml 6
. La nestra
visualiz-zata ome risultatodell'invo azione del ostruttoredella lasse Sele tDo sType
presenta inque pulsanti: tre sono grandie onsentono laselezione diun
parti o-lare tipo di do umento (Boni o, Fattura,Curri ulum), gli altridue, più pi oli
e situati più in basso, onsentono di tornare indietro o di abbandonare il
pro-gramma. A ias uno dei tre bottoni più grandi, è asso iata un'azione ollegata
al li del tasto sinistro del mouse; tale azione, he onsente l'apertura del form
relativo al do umento pres elto, è denita nel le Do sType.xml dal parametro
asso iatoall'attributoa tionlistener. Il odi eJavaperlagestioneditale
oman-doèdeltutto simileaquellogiàvistonellistato8.1e onsiste, an oraunavolta,
nell'implementare il metodo a tionPerformed(A tionEvent e) dell'interfa ia
A tionListener.
Restando all'interno di Sele tDo sType, possiamo trovare an ora i metodi
de-di ati all'us itadalprogramma ed alsalvataggio deidati inseriti nel form,il ui
odi e èstato pre edentemente analizzato e ompare nellistato 6.8.
Una volta ompilati tutti i ampi d'inserimento del form, si può pro edere on
l'a quisizione del do umento, he verrà analizzato nel dettaglio nella prossima
sezione.
8.5 La lasse ImageEditor
La lasse ImageEditor è senza dubbiola più importante delprogetto, per hé
attraversoessa si ompionoledueazioniper uil'interosoftwareèstatopensato:
las ansione el'inviodeido umentia quisitialsistema do umentale. Èlaprima
lassesu uihoiniziatoalavorare ed èquella he hari hiestoglisforzimaggiori,
6
poi hé realizza una serie di me anismi he ne essitano di essere trattati on
attenzione.
Il ostruttore della lasse svolge al une azioni preliminari:
•
inizializzaun ontatore (peril onteggiodelle pagine s ansionate);•
selezionalaperiferi adis ansionepredenita(attraverso ilmetodoSour e setSour e(String path), il uinome è s ritto sullesour e.xml);•
istanziaun esemplare della lasse JFrame perlavisualizzazione della barra del menù, del pannello dei pulsanti e di quello he onterrà l'immagines ansionata;
•
ontrolla,attraversoilmetodoboolean he kEmptyFolder(String path), he la artella dei le da inviare (DesktopAppli ation/Stori o/Ready) siavuota. In aso ontrario avvisa l'utente on un messaggio, visualizzato in
un frame reato dal metodo void warningFrame(String title, String
message) (si fa iariferimentoallagura 7.8).
Il metodo void addComponentsToMainFrame () realizza l'intera interfa ia
gra a: nella parte superiore del frame è posizionata la barra del menù, a
si-nistra 'è il pannello on i pulsanti per la modi a dell'immagine e nella parte
entrale 'è il pannello he onterrà l'immagine del do umento a quisito (è di
tipo JS rollPane); nell'angolo in basso a destra si trovano i pulsanti di
s an-sione, invio, us ita. I omponenti (pannellie pulsanti)sono dispostise ondo un
layout di tipo FormLayout; esso non è fornito dalle librerie standard Java, ma
viene introdotto nel progetto grazie alle librerie open sour e jgoodies. Il layout
FormLayout è stato ideato per essereuno strumentopre iso, essibilee potente,
ma allostesso tempo fa ile da omprendere ed appli are. Il odi e he viene
ri-portato (listato8.2), atitolo d'esempio,posizionaun oggettoditipoJButton su
un pannello a ui viene appli atoil FormLayout.
Il ostruttoredella lasse FormLayoutdenis e perprima osauna griglia,
spe i- andone il numero e ledimensioni di olonnee righe; inse onda battuta viene
aggiunto un omponente allagriglia,in una posizione spe i a.
Listing 8.2: Pannello on layout ditipo FormLayout
1
buttonPanel.setLayout(new FormLayout("30dlu, 30dlu, 10dlu, 30
dlu, 30dlu",
3
4
scanButton.setText("Nuova Scansione");
5
scanButton.addActionListener(new ActionListener() {
6
public void actionPerformed(ActionEvent evt) {
7
scanAction(evt);
8
}
9
});
10
11
buttonPanel.add(scanButton, CC.xywh(3, 3, 1, 2, CC.CENTER, CC.
CENTER));
Analizandoil odi e,osserviamo he vengono reate5 olonnee7righe,le ui
di-mensionisonotuttespe i ate on l'unitàdimisuradlu (Dialog Unit). LeDialog
Unit sonounità parti olari esono una aratteristi adelFormLayout: esse
han-noil ompitodipreservareleproporzioniqualoravenissemodi atalarisoluzione
del omponente he implementa tale layout. Cias un omponente gestito da un
FormLayoutèasso iatoadun'istanzadiCellConstraints he spe i adoveesso
debbaessere visualizzato e ome debba essere allineato.
Creata la griglia, il bottone può essere aggiunto on il metodo add(Component
, CellConstraints ) nella posizione spe i ata dai parametri dell'oggetto
CellConstraints. Nel odi e riportatosi noterà he viene fattouso della lasse
CC, he èuna lasse fa tory per la reazione dioggetti CellConstraints.
L'al-ternativasarebbestata quelladidenireun nuovooggettoCellConstraints
= new CellConstraints() epoisu diesso appli are ivalori he determinano il
posizionamentodel omponenteall'internodellayout. IlmetodoCC.xywh(3, 3,
1, 2, CC.LEFT CC.CENTER) indi a he il bottone deve essere posizionato nella
olonna 3, alla riga 3, o upa una sola olonna e si estende per due righe. Il
suo allineamento poi prevede he sia posizionato a sinistra verti almente e sia
entrato orizzontalmente.
Nella lasse ImageEditor sono ontenuti inoltre i metodi deniti per la
rea-lizzazionedelle funzioniasso iate aipulsantipresenti nellanestraprin ipale del
programma (ovviamente le stesse azioni sono eseguibili an he tramite barra del
menù). Si riporta quindi una listadei metodi disponibili, preo upandosi poi di
analizzare quellipiù signi ativi.
•
s anA tion(A tionEvent e) - esegue las ansione del do umento;•
addPageA tion(A tionEvent e) - aggiunge una pagina al set orrente di s ansioni;•
hangeDevA tion(A tionEvente) - ambiaildispositivodautilizzareperla s ansione;•
horizontalFlipA tion(A tionEvent e) e verti alFlipA tion(A tionEvent e) -ri hiamano i metodi per esegire il ribaltamento (orizzontale o verti ale)dell'immagines ansionata;
•
rotateRightA tion(A tionEvent e) e rotateLeftA tion(A tionEvent e) - ri- hiamanoi metodiperruotaredi90gradi adestra oasinistra l'immagine;•
grays aleA tion(A tionEvente)-invo ailmetodo hetrasformal'immagine ins ala di grigi;•
bla kWhiteA tion(A tionEvent e) - invo a il metodoper la trasformazione dell'immaginein bian oe nero;•
brightenA tion(A tionEvente)edarkenA tion(A tionEvente)-ri hiamano i metodi peraumentare odiminuire laluminositàdella s ansione;•
ontrastIn rA tion(A tionEvent e) e ontrastDe rA tion(A tionEvent e) -invo ano i metodi per aumentare o diminuire il ontrasto dell'imaginea -quisita;
•
resizeA tion(A tionEvent e) - eettua un ridimensionamento dell'immagi-ne;•
uploadA tion(A tionEvent e) - salvaed invia l'immagine.Il metodos anA tion(A tionEvent e)realizzalas ansione deldo umento.
Esso vieneinvo atoallapressionedelbottoneNuovas ansione ed hail ompito
di iniziare una nuova a quisizione. Questo pulsante dà inizio ad un nuovo set
dis ansionipertanto,per prima osa, sio upadi an ellare eventuali immagini
importateina quisizionipre edenti(presentinella artellaTemp_image);azzera
quindi il ontatore dellepagine epro ede on las ansione. Il odi e relativoalla
s ansione è già stato illustrato in 3.4; a quanto già detto va aggiunto un solo
dettaglioeriguardailformato on uiillevienesalvato: siède isodiinviareal
ba k o e do umenti di tipo TIFF, poi hé questo parti olare formato onsente
il salvataggio di le multipagina. Per ottenere i le TIFF, he non sono
è nata a orredo della libreria JTwain (presentata in 3.3), proprio on l'intento
disupportare questo parti olare formato dile. In parti olare, siè fatto uso del
metodo reateTIFFFromImages(Buff ered Arra y array,int onv, int omp,
File f) he ri hiede ome parametro un array di BufferedImage ( he saranno
trasformate in un uni o le TIFF), due oggetti di tipo int he spe i hino la
onversione romati a ed iltipo di ompressioneda appli arealleimmaginied il
ledioutput.
Il metodo hangeDevA tion(A tionEven t e) ri hiama l'interfa ia utente
giàrealizzata dallalibreriaJTwain perlaselezione dellaperiferi adia quisizione
delle immagini (Sour eManager.instan e().sel e tS our eUI( )) e salva il
no-medeldispositivoselezionatodirettamentenellesour e.xml;talelevieneletto
adogni avvio del programmaperselezionare la periferi a dautilizzare.
Per nire analizziamo il metodo uploadA tion(A tionEvent e) he esegue
il salvataggio e l'invio al ba k o e dei do umenti a quisiti. Il metodo può
es-sere ri hiamato in due istanti diversi: prima dell'ese uzione della s ansione (nel
asosiano rimastiledainviareallapre edente hiusuradelprogramma)odopo
l'a quisizione deldo umento.
Si immagini he, mentre si sta eseguendo una s ansione, per un guasto te ni o
sullarete nonsiapossibileinviareilled'immagineappena reato, he èrimasto
salvato nella artella DesktopAppli ation/Stori o/Ready. Premendo il pulsante
Salvaed invia siinvo auploadA tion(A tionEvent e) heperprima osa
ef-fettuaun ontrollonella artellaReady allari er adieventualilenonan ora
in-viati. Sela artellanon risulteràvuota,alloraverràvisualizzatoun FileChooser
he onsentirà di selezionare il le da inviare (riferimento all'immagine 7.9). A
seguire due listati: il primo mostra la realizzazione del FileChooser, il se ondo
svela una parte di odi e del metodo uploadA tion(A tionEvent e).
Listing 8.3: Finestra diselezione deileda inviare
1
JFileChooser fileUploaderFrame() {
2
JFileChooser fileUploader = new JFileChooser();
3