Java/AWT e Swing

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search
Java
Linguaggio Java
categoria · sviluppo · modifica

Come posso contribuire?
→ Vai su Wikiversity

Guida alla programmazioneJava/Introduzione - Specifica di linguaggioJava/Tipi di dato - Libreria standard

  1. Comunicazione serialeJava/Comunicazione seriale
  2. Stream
  3. Input e output su consoleJava/Input e output
  4. Java Collections Framework
  5. AWT e SwingJava/AWT e Swing
  6. Reflection
  7. SerializzazioneJava/Serializzazione
  8. SocketJava/Socket

AWT e Swing[modifica]

Lo standard ufficiale per la realizzazione delle GUI è Swing, implementato in un insieme di classi che si trovano sotto il package javax.swing e i suoi sottopackages. Esso ha esteso il vecchio sistema, AWT, che soffriva di numerosi difetti.

In entrambi, il programma crea e manipola finestre e componenti grafici senza preoccuparsi della loro effettiva implementazione. Il meccanismo è il seguente:

  1. il programma richiede alle librerie (AWT o Swing che sia) la creazione o la modifica di oggetti che rappresentano finestre, componenti grafici, ecc.;
  2. l'implementazione della libreria si occupa della loro visualizzazione grafica, delegandola, in ultima analisi, al sistema operativo.

La differenza principale tra AWT e Swing sta nel livello al quale viene concretizzato il punto 2. AWT delega al sistema operativo la creazione e l'implementazione interna delle finestre e dei componenti, mentre Swing utilizza, dovunque possibile, codice scritto direttamente in Java.[1] Questo codice costituisce, appunto, l'implementazione delle classi che fanno parte della libreria Swing, e viene eseguito insieme con il codice del programma, nella stessa macchina virtuale.

Nonostante i numerosi vantaggi di Swing rispetto ad AWT, ad oggi esistono ancora classi di AWT che sono molto utilizzate; questo essenzialmente perché

  • Swing non è stato costruito partendo da zero, ma sulla base delle classi fondamentali del sistema grafico AWT (Component, Container, LayoutManager e le sue implementazioni, gestione degli eventi, ecc.)
  • AWT non comprende solo classi riguardanti strettamente la GUI, ma anche classi per la gestione della stampa, per la manipolazione di immagini, di forme geometriche, ecc.

Per questi motivi, il package java.awt e i suoi sottopackages risultano ancora oggi importati tantissimo e Swing va considerato non come un rimpiazzo di AWT, ma, piuttosto, come una sua estensione.

Esempio[modifica]

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;

class CustomFilter extends DefaultStyledDocument{
    private static final int MAX_DIM = 25;
    
    /*
     * Controllo che il contenuto dei JFormattedTextField non superi i 25 caratteri.
     */
    public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
        /*
         * str rappresenta la stringa che sta per essere scritta nel componente.
         * Questo metodo infatti è chiamato prima di inserire del testo nel documento.
         */
        int strLen = str.length();
        int docLen = this.getLength();
        if (docLen + strLen > CustomFilter.MAX_DIM)
            if (docLen > CustomFilter.MAX_DIM)
                super.insertString(offset, getText(0,CustomFilter.MAX_DIM), a); // scrive la stringa di testo nel documento
            else{
            int dimTextToSend = CustomFilter.MAX_DIM - docLen;
            super.insertString(offset, str.substring(0,dimTextToSend), a);
            } else
                super.insertString(offset, str, a);
    }
}
import java.util.Locale;
import javax.swing.InputVerifier;

class CustomValueVerifier extends InputVerifier {
 
    public boolean verify(JComponent input) {
        /**
         * verifica che sia stato inserito del testo nel componente JFormattedTextField
         * e che contenga solo lettere o . In caso contrario il componente riottiene il focus
         **/
        JFormattedTextField jtf = (JFormattedTextField) input;
        String text = jtf.getText().trim();
        if (text.equals("")) {
            jtf.setValue(null);
            return false;
        }
        for (int i=0; i<text.length();i++){
            char ch = text.charAt(i);
            if(!Character.isLetter(ch) && !Character.isSpaceChar(ch))
                return false;
        }
        jtf.setValue(text.toUpperCase(Locale.ITALY));
        return true;
    }
}

Approfondimenti[modifica]

Alcuni strumenti sono stati messi a disposizione degli sviluppatori che hanno problemi con Swing o che non ne conoscono tutte le funzionalità.

Java Developer Kit
  • lo SwingSet2, che è un programmino dimostrativo delle funzionalità di Swing, ed è disponibile a questo indirizzo e nella sottocartella /demo/jfc/SwingSet2 del JDK. Il codice sorgente che crea gli oggetti Swing visibili sullo schermo è disponibile scegliendo la tab "Source code" all'interno del programma, e anche nella sottocartella /src della cartella in cui è il demo;
  • gli altri demo inclusi nel JDK sotto la cartella /demo/jfc/;
Guide

Note[modifica]

  1. In realtà, anche il sistema Swing non può fare a meno di effettuare determinate chiamate di base al sistema operativo, poiché è quest'ultimo che, in fondo, ha il controllo finale dell'ambiente grafico. Il concetto su cui si basa Swing è che queste chiamate possono essere realmente ridotte all'osso, perché la gran parte del codice che si occupa di implementare l'aspetto grafico e perfino il comportamento dei componenti può essere implementata in Java.