Riempire dinamicamente una jTable in Java

Ultimamente sto utilizzando intensamente Java per lavoro. Sto realizzando un gestionale abbastanza corposo, dove ho potuto sperimentare diverse cose interessanti.

Nel disegnare le interfacce, uno degli oggetti che sto trovando sempre più utile, è la jTable, nient’altro che una semplice tabella (la vecchia DataGrid di visual basic). Inizialmente avevo trovato un po’ ostico capire come funzionasse, nonostante ci fossero parecchi esempi che danno molti consigli su come usarle. Una delle pagine di esempi più complete è questa sul sito oracle.

Voglio però spendere qualche riga per spiegare come poter facilmente caricare una jTable leggendo i dati da un resultset o da un elenco qualsiasi.

Penso che il concetto più semplice per utilizzare al meglio le jTable sia implementare una List<T> (dove T può essere un array di Object o di String o una vostra classe personale, fate voi) con una ArrayList o una LinkedList. Questa lista terrà aggiornata la jTable.

Personalmente creo sempre un metodo che chiamo “refreshTable” che legge i dati dalla lista e li inserisce nella tabella. Il metodo non farà altro che usare un iteratore per scorrere la lista e creare una matrice di Object da passare alla nostra jTable per riempirla.

        //Creo array di intestazioni
        String [] headers=this.getTableHeaders();
        //Creo matrice di dati
        Object[][] data=new Object[this.lista.size()][headers.length];
        int i=0;
        for(Iterator<String[]> it=lista.iterator();it.hasNext();){
            String[] tmp=it.next();
            for(int j=0;j<tmp.length;j++){
                data[i][j]=tmp[j];
            }
            i++;
        }
        //Setto dati e intestazioni della tabella
        this.myJTable.setModel(new javax.swing.table.DefaultTableModel(data, headers){@Override public boolean isCellEditable(int rowIndex, int mColIndex) { return false; }});
        //Setto larghezza colonne
        this.setTableCellsSize(this.myJTable);
        //Imposto allinamento delle celle al centro
        DefaultTableCellRenderer renderer=new DefaultTableCellRenderer();
        renderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        this.myJTable.setDefaultRenderer(this.myJTable.getColumnClass(0), renderer);
        this.myJTable.updateUI();

Così facendo abbia riempito la nostra jTable. Il metodo che fa ciò è il setModel(), al quale io passo sempre una matrice di Object che contiene i dati veri e propri e un array di String che contiene le intestazioni della tabella (che leggo dal mio metodo this.getTableHeaders() ). Oltre a questo ho creato un metodo (this.setTableCellsSize() ) che imposta la larghezza delle varie colonne della tabella:

        int prefWidth=(this.getWidth()/2)/(this.getHeadersTable()).length;
        tbl.setAutoResizeMode(jTable.AUTO_RESIZE_OFF);

        tbl.getColumnModel().getColumn(0).setPreferredWidth(prefWidth+20);
        tbl.getColumnModel().getColumn(1).setPreferredWidth(prefWidth+100);
        tbl.getColumnModel().getColumn(2).setPreferredWidth(prefWidth+20);
        tbl.getColumnModel().getColumn(3).setPreferredWidth(prefWidth-30);
        tbl.getColumnModel().getColumn(4).setPreferredWidth(prefWidth+20);
        tbl.getColumnModel().getColumn(5).setPreferredWidth(prefWidth+20);
        tbl.getColumnModel().getColumn(6).setPreferredWidth(prefWidth-20);
        tbl.getColumnModel().getColumn(7).setPreferredWidth(prefWidth+20);

Nelle ultime righe ho invece dichiarato un Renderer per settare l’allineamento al centro delle celle della jTable.

Prestate attenzione alla linea dove viene eseguita la setModel(): qui ho riscritto il metodo isCellEditable, in modo che restituisca sempre false. Così facendo qualsiasi cella della nostra jTable non potrà essere editata.

Se vi servissero esempi più dettagliati (ad esempio per inserire delle checkbox in una delle colonne o per aprire menu al pressione del tasto destro del mouse sulla tabella) fate un fischio! ;-)

Nuovo tema per il blog!

Come (spero) vi siate accorti, sono riuscito finalmente ad ultimare il nuovo tema per il mio blog.

Mi sono sempre promesso che prima o dopo avrei lavorato alla realizzazione di un mio tema, visto che fino ad oggi avevo sempre utilizzato temi scaricati dalla sezione apposita di wordpress e oggi ho finalmente un tema tutto mio.

Ho cercato di renderlo più leggero del precedente, riducendo al minimo il codice javascript, alleggerendo il css ed ispirandomi a design minimalisti, senza troppi fronzoli per rendere il tema intuitivo e cercando di ricordare qualche regola di HCI.

Spero vi piaccia, ma aspetto critiche e suggerimenti e ovviamente se trovate dei bugs, segnalatemeli, thanks!

iOs 4 e iPhone 3G: prime impressioni e commenti (meditati)

iOs4

Come (quasi) tutti voi bene sapete, sono un felice possessore di iPhone 3G da ormai più di 1 anno e mezzo.

Durante i primi 6 mesi di utilizzo (pre iOs 3) mancavano ancora diverse funzionalità che potevano rendere iPhone un telefono serio e non un giocattolo iper-tecnologico. Con l’arrivo dell’estate e l’introduzione di iOs 3 vennero apportate numerose aggiunte che resero iPhone un cellulare a tutti gli effetti, più tutto il resto (mentre prima era solo tutto il resto). E proprio quel “tutto il resto” permette di dire a chiunque che iPhone ha cambiato il mondo dei cellulari (non dite di no, perchè sapete di avere torto :-P ).

Quest’estate è stato nuovamente aggiornato il software di iPhone (insieme all’introduzione di iPhone 4) e dal 21 giugno scorso è disponibile per tutti i possessori di iPhone (dal 3G in avanti) iOs 4

Be’ di primo impatto si può pensare: figo, un telefono di 2 anni fa, che viene ancora aggiornato (gratuitamente, non dimentichiamocelo). Bisogna dire che ovviamente il mio FerrePhone non possiede tutte le nuove funzionalità, pari pari ad iPhone 4, però alcune migliorie ci sono state. Tralasciando il dock 3d (di cui non me ne potrebbe fregare di meno) e gli effetti grafici allo sblocco del telefono, la funzione che trovo più utile è la cosidetta “folder” ovvero la suddivisione in cartelle delle applicazioni. Trascinando l’icona di una app sopra un’altra, queste due vengono inserite in una cartella, che prende il nome automaticamente a seconda delle affinità che ci sono tra le due app (ma che si può tranquillamente modificare).

Dopo alcuni minuti di utilizzo però, mi sono accorto che iOs4 sul mio iPhone sembrava avere qualche difficoltà. Testandolo per qualche giorno mi sono accorto che effettivamente iOs4 ha bisogno (probabilmente) di hardware più prestante, si nota infatti in alcuni momenti un rallentamento nell’apertura delle app (anche quelle di default) o effetti grafici non perfettamente fluidi. A questo punto voi mi direte: “ma che cacchio pretendi da un telefono di 2 anni fa’?”. Ok avete ragione, non posso pretendere nulla, Apple ha probabilmente deciso di rilasciare iOs4 anche per iPhone 3G nonostante probabilmente si fosse accorta che non sarebbe stato così prestante, ma per evitare critiche che sarebbero piovute a raffica, se così non avessero fatto. Ovviamente queste difetti sono “minimi” e non pregiudicano l’utilizzo normale di tutti i giorni, ma ad un occhio critico risaltano abbastanza nell’immediato. Che dire? Speriamo che a breve Apple noti questo problema e rilasci qualche aggiornamento, anche se non credo si possa fare molto (se non passare ad iPhone 4 ;) )

Javatar!

Ho trovato oggi su facebook questo fantastico trailer, e non vedo l’ora di andarlo a vedere al cinema! Chi viene? :-P

Differenze tra il tipo char e il varchar in MySQL

Prosegue il mio lavoro insieme a MySQL, ormai lo sto usando intensamente in molti programmi non solo in php, ma anche nella programmazione in java.

Usandolo così massicciamente sto continuando a scoprire cose interessanti. Probabilmente quella di cui vi parlo oggi, non è una novità per qualcuno, ma credo sia bene chiarirla per chi non lo sapesse.

Qualche giorno fa stavo lavorando su un database che non ho creato io e mi sono imbattuto in un campo CHAR. Subito non ci ho fatto caso, ma poi mi è venuto in mente che di solito quando devo dichiarare un campo stringa, uso il tipo VARCHAR. Mi sono così documentato un po’, cercando su google ho trovato diverse spiegazioni su forum, ma come sapete di quello che viene detto sui forum è sempre meglio non fidarsi troppo. Ho fatto quindi direttamente riferimento alla guida ufficiale MySQL (in inglese) e ho scoperto quello che mi interessava.

Innanzitutto prima di MySQL 5.0.3 sia il tipo char sia il varchar potevano essere dimensionati da 0 a 255 caratteri. Da MySQL 5.0.3 in poi il tipo varchar supporta lunghezza da 0 a 65535 caratteri. Oltre a questa differenza di dimensionamento c’è un’altra sostanziale differenza: quando dimensionate un campo con il tipo char, ad esempio char(4) verrà effettivamente occupato spazio per 4 caratteri, anche se il valore che inserirete nel campo sarà di un solo carattere. Lo spazio rimanente verrà riempito con degli spazi. A differenza del char, il varchar invece utilizza solamente lo spazio necessario, richiesto dal valore inserito nel campo più un byte (non sono riuscito a trovare il motivo, ma credo sia il famoso “tappo” in stile C).

Riepilogando quindi:

Valore CHAR(4) Spazio richiesto
VARCHAR(4) Spazio richiesto
'' '    ' 4 bytes '' 1 byte
'ab' 'ab  ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

Per finire, come si può vedere nell’ultima riga dell’esempio, per tutti e due i tipi, se il valore supera la lunghezza effettiva dichiarata, esso verrà troncato.

In sostanza se sapete che nel campo che state dichiarando dovrete inserire valori sempre della stessa lunghezza, senza eccezioni, potrebbe essere intelligente dichiararlo char mentre invece se, come succede nella stragrande maggioranza dei casi, il campo che state dichiarando conterrà stringhe generiche, allora vi converrà utilizzare il tipo varchar.

Google ti aiuta anche a trovare lavoro…

Sei disoccupato o non riesci a trovare il lavoro dei tuoi sogni? Vuoi a tutti costi tentare di essere assunto nel posto di lavoro che sogni da anni? Google può essere l’unico elemento che ti serve per realizzare i tuoi desideri! ;-)

Un trentenne americano, stanco di inviare curriculum a tutte le aziende pubblicitarie di New York senza ricevere risposta, si è inventato un modo tutto suo per arrivare direttamente al direttore creativo, saltando a piè pari tutti i vari uffici di risorse umane e reclutamento. Come ha fatto?

Ha investito 6 dollari ed ha acquistato il Top Spot di Google (il primo risultato delle ricerche di Google, quello in giallo per intenderci) dei nomi di alcuni dei più famosi direttori creativi di studi pubblicitari newyorkesi, inserendo questa frase:

Googleggiare con il tuo nome è davvero divertente, ma anche assumermi è altrettanto divertente

Ovviamente, visto che siamo qui a parlarne, questa nuova trovata pubblicitaria ha avuto successo e poco dopo Alec Brownstein ha ricevuto le chiamate che aspettava. Ha pagato il Top Spot per 5 nomi, e ha ricevuto 4 telefonate per proposte di colloqui. Di queste 4, 2 sono diventate offerte di lavoro e lui ha finalmente ottenuto il lavoro che voleva presso lo studio di New York della Y&R una multinazionale specializzata in pubblicità.

La trovata geniale è stata aiutata anche dal narcisismo delle persone, ma in fondo chi di voi non ha mai provato a googleggiarsi? ;-P

V-Day: in rampa di lancio!

Futurshow Station

Volevo condividere con voi questo spettacolo… Un palazzetto dello sport da 8000 posti, il Futurshow Station di Casalecchio di Reno (BO) che domani intorno alle 18(o forse anche prima) sarà completo in ogni ordine di posto. E io sarò lì a soffrire con tutti gli altri cuneesi, a sperare e a urlare(sportivamente) contro gli avversari.

Sarà una giornata all’insegna del volley, un evento in stile superbowl, che all’inizio mi lasciava un po’ scettico, ma ora alla vigilia mi riempie di adrenalina.

Ora tocca a voi ragazzi, è un’occasione irripetibile diamo il massimo per non farcela scappare!

FORZA CUNEO!!!

ps: per chi ancora non lo sapesse, la partità sarà trasmessa in diretta su raisport più dalle 17,30 e a Cuneo verrà installato un maxischermo in piazza Virginio, per stare “vicino” ai ragazzi e tifare tutti insieme!

Prime impressioni sul Ferrebook pro…

Dopo alcune ore di utilizzo sono pronto per dare le mie prime impressioni sul mio nuovo mac: “fa schifo!”….
Ahahahah ci avevate creduto? Ma siete pazzi? Sono 6 mesi che rompo le scatole con il mac, vi pare che ora possa dire che fa schifo?
Scherzi a parte, bando alle chiacchere, veniamo al “succo” del discorso: come tutte le cose bisogna abituarsi, i tasti rapidi sono diversi, la tastiera è diversa, ma soprattutto alcuni concetti mi pare di aver capito che siano diversi. Ad esempio mi sono scervellato per trovare il tasto rapido per tagliare un file, salvo poi scoprire che “il taglia” non esiste (ovviamente sono un newbie, per cui correggetemi se dico vacc..ehm fesserie) oppure devo ancora abituarmi ad avere duecentoottantatremilacinquecentocinquantatrè programmi aperti (e fare ordine ogni tanto con qualche mela+q).

Veniamo ora ai pregi e difetti del mio nuovo amico:

Questo pregio vi basta? 20 secondi da quando si preme il tasto di accensione a quando lo si può iniziare ad usare? Credo che il disco solid state (SSD) sia uno degli acquisti più azzeccati (dopo il mac in sè ovviamente).

Come mi era già stato detto da molti, ti accorgi che è un mac, appena lo estrai dalla scatola, e non sto parlando dell’aspetto visivo. È solido, robusto non so come spiegare, fa subito una bella impressione! Ero già ben abituato con il mio vecchio Asus (davvero un bel portatile) ma questo è ancora un piano sopra: non una vite, non un punto fastidioso, tutto come si deve insomma.

Altro pregio davvero insolito per un portatile: rumorosamente inesistente. Sì lo definisco così soprattutto dopo che la prima sera mentre lo stavo usando, sentivo il solito ronzio di un portatile (per niente fastidioso, ormai ci ero abituato).. Poi dopo averlo spento continuavo a sentire questo ronzio, finchè mi sono accorto che era l’altro portatile che avevo acceso per passare i dati sul mac. :-D

La tastiera sempre un dettaglio da niente, però manco a dirlo questa è davvero ben fatta. Certo mancano dei tasti rispetto ad un pc, ma con qualche scorciatoia si risolvono tutti i problemi. Ovviamente devo ancora mettermi in testa di usare il tasto mela al posto del ctrl.

Per quanto riguarda le prestazioni invece direi che non posso assolutamente lamentarmi, apro decine di programmi insieme (iMovie,Netbeans, Mail, Firefox, iChat e chi più ne ha più ne metta) e ovviamente non fa una piega (ci mancherebbe, ouh! ;-) ).

Prima di chiudere ribadisco un concetto espresso in questi giorni dal nostro caro Steve: Flash per mac fa pietà. Consuma un sacco di batteria, scalda all’inverosimile la macchina e non mi piace, ok? Quando ci decidiamo a passare ad html 5, tutti?

In definitiva per il momento sono estremamente soddisfatto dell’acquisto fatto, devo ancora rendermi conto se ci sono dei difetti (quelli si vedono dopo un po’ di tempo no? ;-) ) ed imparare ad usarlo decentemente, ma posso dire che il mondo mac mi piace, e mi son trovato subito a mio agio ;-)

Aaaaaaaaaaaaaaaaaaaaaaaaahhhh!!!!!!

Includere jQuery nel proprio tema wordpress

Il titolo potrebbe farvi pensare che questo post potrebbe essere inutile… Infatti il metodo più semplice per usare jQuery in un tema per wordpress è quello di inserire una nuova sorgente per uno script javascript con il tag:

<script type="text/javascript" src="......./jquery.js"></script>

Inizialmente il tutto potrebbe anche funzionare e non è detto che possa filare tutto liscio senza crearvi nessun fastidio.

I problemi però potrebbero iniziare quando deciderete di includere un plugin nel vostro blog.

Infatti molti plugin di wordpress richiedono un framework javascript (non necessariamente jQuery) per funzionare. WordPress include già il file .js di jQuery e quando un plugin lo richiede, il sistema include già lo script.

Per questo il modo più semplice è sicuro di inserire jQuery nel proprio tema è quello di inserire nel file header.php sopra il richiamo della funzione wp_head():

wp_enqueue_script("jquery");
wp_head();

Ora wordpress includerà il file javascript di jQuery, ma bisogna ancora compiere un passo per poter essere sicuri di aver risolto tutti i problemi. Se fossero necessarie altre librerie javascript diverse da jQuery, quest’ultimo potrebbe andare in conflitto, perciò risolviamo il problema con queste istruzioni javascript:

var $jQ = jQuery.noConflict();

$jQ(document).ready(function(){
       alert("Hello World!");
});

Se avrete fatto tutto come si deve, al caricamento della pagina apparirà una finestra di avviso con scritto Hello World! ;-)