• Non ci sono risultati.

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 singole

pagine;

il metodo JRadioButton reateRadioButtons(int itemsPerPage, int target, String title), he rea i link alla pagina Pre edente e

Su - 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'immagine

s ansionata;

ontrolla,attraversoilmetodoboolean he kEmptyFolder(String path), he la artella dei le da inviare (DesktopAppli ation/Stori o/Ready) sia

vuota. 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'imagine

a -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

fileUploader.setDialogTitle("Seleziona");

4

tiffFilterCreator(fileUploader);

5

fileUploader.setApproveButtonMnemonic(KeyEvent.VK_U);

6

fileUploader.setCurrentDirectory(new File(basePath + "\\

Storico\\Ready\\"));

Documenti correlati