Lezione in Laboratorio 3

Martedì, 19 Dicembre 2008

OBIETTIVI DELLA LEZIONE

In questa lezione completeremo e discuteremo eventuali esercizi rimasti irrisolti dalle scorse esercitazioni.

GUI in Java

Lo sviluppo di una GUI in Java è argomento fondamentale per comprendere appieno le potenzialità di Java, ma le dimensioni del nostro corso non permettono di affrontare questo argomento in modo esaustivo. Oggi completiamo la panoramica di introduzione, iniziata durante le esercitazioni.

Per orientarvi nello studio personale, tenete presente che esistono due grandi famiglie di componenti grafici in Java.

I componenti Java AWT (Abstract Windowing Toolkit) sono quelli presenti nel linguaggio dalle origini e dipendono dalle capacità grafiche della piattaforma utente. Quindi, cambiando la piattaforma su cui un applicazione viene eseguita, l'aspetto dell'applicazione cambia di conseguenza. Per questo motivo sono anche detti componenti "pesanti".

Dalla versione 2 (1.2) di Java in poi, sono stati introdotti nel linguaggio anche i componenti Swing, che sono scritti completamente in Java. Per questo motivo hanno pressoché la stessa struttura grafica su qualunque piattaforma e sono anche detti componenti "leggeri". Al di là delle semplificazioni, i componenti Swing estendono componenti AWT da cui dipendono (quindi bisogna padroneggiare entrambe le gerarchie di classi).

Anche per Java, come per altri linguaggi, esistono alcuni GUI editor. Ad esempio, all'interno del progetto di sviluppo di Eclipse, esiste il progetto "Visual Editor": http://www.eclipse.org/vep/WebContent/main.php. Il progetto è maturo e supporta completamente i controlli AWT e Swing, ma lo sviluppo del progetto è stato quasi sospeso da un paio di anni. Trovate una breve (anche se obsoleta) introduzione all'URL: http://www.ibm.com/developerworks/library/os-ecvisual/. Alternative valide per Eclipse sono Jigloo (gratuito per uso non commerciale), WindowBuilder (commerciale / gratuita una versione limitata)

Utilizzando invece l'IDE NetBeans si può utilizzare l'ottimo editor di GUI "Matisse", che al momento è probabilmente il più completo e performante in ambito opensource.

Costruiamo una piccola applicazione GUI con NetBeans

L'applicazione che vogliamo costruire è molto semplice e si ispira al tutorial di Sun che potete utilizzare per l'apprendimento personale. È un semplice calcolatore dell'indice di massa corporea. La GUI dell'applicazione è la seguente:



Mentre il codice a cui arriveremo, autocomponendolo con NetBeans, sarà pressapoco il seguente (la formattazione è inappropriata per la visualizzazione sullo schermo, ma è generata automaticamente):

/*
 * IndiceMassaCorporeaGUI.java
 *
 * Created on 17 dicembre 2008, 19.13
 */

import javax.swing.UIManager;

/**
 *
 * @author  sassi
 */
public class IndiceMassaCorporeaGUI extends javax.swing.JFrame {

    /** Creates new form IndiceMassaCorporeaGUI */
    public IndiceMassaCorporeaGUI() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        PesoTextField = new javax.swing.JTextField();
        PesoLabel = new javax.swing.JLabel();
        AltezzaTextField = new javax.swing.JTextField();
        AltezzaLabel = new javax.swing.JLabel();
        CalcolaButton = new javax.swing.JButton();
        BMILabel = new javax.swing.JLabel();
        MessageBarLabel = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("BMI");

        PesoLabel.setText("Peso (kg)");

        AltezzaLabel.setText("Altezza (m)");

        CalcolaButton.setText("Calcola!");
        CalcolaButton.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                CalcolaButtonMouseEntered(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                CalcolaButtonMouseExited(evt);
            }
        });
        CalcolaButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                CalcolaButtonActionPerformed(evt);
            }
        });

        BMILabel.setText("BMI");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(MessageBarLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 129, Short.MAX_VALUE)
                    .addComponent(CalcolaButton, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(BMILabel, javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(AltezzaTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(PesoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(PesoLabel)
                            .addComponent(AltezzaLabel))))
                .addContainerGap())
        );

        layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {AltezzaTextField, BMILabel, CalcolaButton, PesoTextField});

        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(PesoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(PesoLabel))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(AltezzaTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(AltezzaLabel))
                .addGap(18, 18, 18)
                .addComponent(BMILabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(CalcolaButton)
                .addGap(18, 18, 18)
                .addComponent(MessageBarLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 15, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

private void CalcolaButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    double peso = Double.parseDouble(PesoTextField.getText());
    double altezza = Double.parseDouble(AltezzaTextField.getText());
    double bmi = peso/Math.pow(altezza,2);
    BMILabel.setText("BMI: " + String.format("%4.1f",bmi));
}                                             

private void CalcolaButtonMouseEntered(java.awt.event.MouseEvent evt) {                                           
    MessageBarLabel.setText("Inserisci peso e altezza!");
}                                          

private void CalcolaButtonMouseExited(java.awt.event.MouseEvent evt) {                                          
    MessageBarLabel.setText("");
}                                         

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        try {
            // Set System L&F
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } 
        catch (Exception e) {
            System.out.println(e);
        }
        
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new IndiceMassaCorporeaGUI().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel AltezzaLabel;
    private javax.swing.JTextField AltezzaTextField;
    private javax.swing.JLabel BMILabel;
    private javax.swing.JButton CalcolaButton;
    private javax.swing.JLabel MessageBarLabel;
    private javax.swing.JLabel PesoLabel;
    private javax.swing.JTextField PesoTextField;
    // End of variables declaration                   

}

©2008 Roberto Sassi