Mòdul 6

Pràctica 5: escollir
Tornar presentació tema
Pràctica 2 Pràctica 2 Pràctica 2 Pràctica 2 Pràctica 1 Pràctica 6 Pràctica 6  
     
     
  Escollir...  
     
  Sovint, en algun punt d'una aplicació, es demana a l'usuari que esculli una o diverses opcions d'entre un conjunt. El SDK de Java, com no podria ser d'altra manera, preveu aquesta situació i ofereix diverses classes per a aquesta tasca.  
     
  JCheckBox  
     
  La classe javax.swing.JCheckBox representa aquests quadrets que permeten seleccionar o no opcions amb un clic del ratolí:  
     
 
     
  Un objecte JCheckBox emet un esdeveniment java.awt.event.ItemEvent cada vegada que el seu estat canvia. Aquest esdeveniment ha de ser recollit per algun objecte que implementi la interfície (interface) java.awt.event.ItemListener, el qual ha d'implementar el mètode  
     
 
public void itemStateChanged (ItemEvent e)
 
     
  per tal de reaccionar a l'esdeveniment. L'estat de l'objecte JCheckBox, si està marcat o no, s'obté tot cridant el mètode de la classe JCheckBox:  
     
 
public boolean isSelected()
 
     
  La figura anterior és una petita aplicació construïda per posar de manifest com funciona tot això:  
     
 
  • En un objecte JFrame hi posaràs, a la posició central (BorderLayout.CENTER) un objecte JLabel amb el text "I LOVE JAVA".

    A la posició est (BorderLayout.EAST) hi posaràs un objecte JPanel, amb el layout GridLayout de dues files i una columna.

  • El color del fons de l'objecte JLabel el controlaràs amb el mètode de la classe JLabel

    public void setBackground(Color color)

    i el color del text el controlaràs amb el mètode de la classe JLabel

    public void setForeground(Color color)

    A cadascun dels casos, color és un objecte de la classe java.awt.Color.

  • El fons dels objectes JLabel pot ser transparent (i, aleshores, el color que mostren és el dels contenidors dels quals en són components) o opac (i, aleshores, el color que mostren és el que hagis fixat amb el mètode setBackground()). La transparència es controla mitjançant el mètode de la classe JLabel

    public void setOpaque(boolean esOpac)

  • A l'objecte JPanel de l'est, hi ha dos objectes JCheckBox, construïts amb el constructor (!)

    public JCheckBox(String etiqueta)

  • Cadascun dels dos objectes JCheckBox té, com a escoltador dels esdeveniments ItemEvent que emet quan en canvia l'estat, l'objecte JFrame, el qual, per tant, ha d'implementar l'interfície (interface) ItemListener.
 
     
  El codi és aquest:  
     
import javax.swing.JFrame;
import java.awt.Container;
import javax.swing.JPanel;
import javax.swing.JCheckBox;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JLabel;

/**
* Escriviu aquí una descripcìó de la classe CheckBoxes
*
* @author (el vostre nom)
* @version (un número de versió o la data)
*/

public class CheckBoxes extends JFrame implements ItemListener {

    /**
     * El Jlabel
     */

    JLabel label;

    /**
     * Mètode constructor per a objectes de la classe CheckBoxes
     */

    public CheckBoxes () {
        setTitle("Exemple amb CheckBox's");
        Container cnt=getContentPane();

        JPanel panelEst=new JPanel();
        panelEst.setLayout(new GridLayout(2,1));

        JCheckBox chkBoxColorFons=new JCheckBox("Color fons");
        chkBoxColorFons.addItemListener(this);
        panelEst.add(chkBoxColorFons);
        JCheckBox chkBoxColorText=new JCheckBox("Color text");
        chkBoxColorText.addItemListener(this);
        panelEst.add(chkBoxColorText);

        cnt.add(panelEst,BorderLayout.EAST);

        label=new JLabel(" I LOVE JAVA! ");
        label.setBackground(Color.RED);
        label.setForeground(Color.BLACK);
        // De moment, fem que el label sigui transparent:
        label.setOpaque(false);

        cnt.add(label,BorderLayout.CENTER);

        pack();
        show();
    }

    /**
     * Mètode que s'executa quan algun dels JCheckbox emet un
     * ItemEvent, és a dir, quan es canvia l'estat d'algun dels
     * JCheckbox
     */

    public void itemStateChanged (ItemEvent e) {
        Object ob=e.getSource();
            if (ob instanceof JCheckBox) {
                JCheckBox chkBox=(JCheckBox)ob;
                // Preguntem si està seleccionat o no:
                boolean seleccionat=chkBox.isSelected();
                    if (chkBox.getText().equals("Color fons")) {
                        label.setOpaque(seleccionat);
                    }
                    if (chkBox.getText().equals("Color text")) {
                            if (seleccionat) {
                                label.setForeground(Color.YELLOW);
                            } else {
                                label.setForeground(Color.BLACK);
                            }
                    }
                label.repaint();
            }
    }

}
 
     
  Observa que l'esquema és el mateix de sempre: uns certs objectes, els quals tenen d'altres objectes que els escolten, emeten alguna mena d'esdeveniments. Quan un escoltador rep l'esdeveniment, reacciona d'alguna manera...  
     
  JRadioButton  
     
  Amb un conjunt d'objectes JCheckBox podem seleccionar diferents opcions que siguin independents entre elles: abans, el color del fons i el color del text es poden seleccionar i deseleccionar cadascun d'ells sense tenir en compte per a res si l'altre està seleccionat o no. En canvi, sovint convé presentar a l'usuari l'elecció d'una sola de les possibilitats que se li ofereixen: objectes de la classe javax.swing.JRadioButton, junt amb un objecte javax.swing.ButtonGroup que els agrupi, estan pensats just per fer aquesta mena de feina:  
     
  A la petita aplicació següent:  
     
 
     
  hi ha dos grups de quatre objectes JRadioButton cadascun: un grup, a la posició oest (BorderLayout.WEST) , controla el color del text del JLabel que hi ha a la posició centre (BorderLayout.CENTER), mentre que l'altre, a la posició est (BorderLayout.EAST) en controla el color del fons. El codi és aquest:  
     
import javax.swing.JFrame;
import java.awt.Container;
import javax.swing.JPanel;
import javax.swing.ButtonGroup;
import javax.swing.JRadioButton;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JLabel;

/**
* Escriviu aquí una descripcìó de la classe RadioButtons
*
* @author (el vostre nom)
* @version (un número de versió o la data)
*/

public class RadioButtons extends JFrame implements ItemListener {

    /**
     * El Jlabel
     */

    JLabel label;

    /**
     * Mètode constructor per a objectes de la classe RadioButtons
     */
    public RadioButtons () {
        setTitle("Exemple amb RadioButtons's");
        Container cnt=getContentPane();

        // Un JPanel pels JRadioButton's de l'est
        JPanel panelEst=new JPanel();
        panelEst.setLayout(new GridLayout(3,1));
        cnt.add(panelEst,BorderLayout.EAST);

        // El grup de JRadioButton's de l'est
        ButtonGroup grupEst=new ButtonGroup();

        JRadioButton rbFonsVermell=
                          new JRadioButton("Color fons vermell");
        // Afegir el nou JRadioButton al grup!!!
        grupEst.add(rbFonsVermell);
        rbFonsVermell.addItemListener(this);
        panelEst.add(rbFonsVermell);
        JRadioButton rbFonsVerd=
                          new JRadioButton("Color fons verd");
        // Afegir el nou JRadioButton al grup!!!
        grupEst.add(rbFonsVerd);
        rbFonsVerd.addItemListener(this);
        panelEst.add(rbFonsVerd);
        JRadioButton rbFonsBlau=
                          new JRadioButton("Color fons blau");
        // Afegir el nou JRadioButton al grup!!!
        grupEst.add(rbFonsBlau);
        rbFonsBlau.addItemListener(this);
        panelEst.add(rbFonsBlau);


        // Un JPanel pels JRadioButton's de l'oest
        JPanel panelOest=new JPanel();
        panelOest.setLayout(new GridLayout(3,1));
        cnt.add(panelOest,BorderLayout.WEST);

        // El grup de JRadioButton's de l'oest
        ButtonGroup grupOest=new ButtonGroup();

        JRadioButton rbTextVermell=
                          new JRadioButton("Color text vermell");
        // Afegir el nou JRadioButton al grup!!!
        grupOest.add(rbTextVermell);
        rbTextVermell.addItemListener(this);
        panelOest.add(rbTextVermell);
        JRadioButton rbTextVerd=
                          new JRadioButton("Color text verd");
        // Afegir el nou JRadioButton al grup!!!
        grupOest.add(rbTextVerd);
        rbTextVerd.addItemListener(this);
        panelOest.add(rbTextVerd);
        JRadioButton rbTextBlau=
                          new JRadioButton("Color text blau");
        // Afegir el nou JRadioButton al grup!!!
        grupOest.add(rbTextBlau);
        rbTextBlau.addItemListener(this);
        panelOest.add(rbTextBlau);

        // El JLabel del centre
        label=new JLabel(" I LOVE JAVA! ");
        // Per tal que es vegin els colors, ha de ser opac
        label.setOpaque(true);

        cnt.add(label,BorderLayout.CENTER);

        pack();
        show();
    }

    /**
     * Mètode que s'executa quan algun dels JRadioButton emet un
     * ItemEvent, és a dir, quan es canvia l'estat d'algun dels
     * JRadioButton
     */

    public void itemStateChanged (ItemEvent e) {
        Object ob=e.getSource();
            if (ob instanceof JRadioButton) {
                JRadioButton rButton=(JRadioButton)ob;
                    if (rButton.getText().equals(
                                         "Color fons vermell")) {
                        label.setBackground(Color.RED);
                    }
                    if (rButton.getText().equals(
                                          "Color fons verd")) {
                         label.setBackground(Color.GREEN);
                    }
                    if (rButton.getText().equals(
                                          "Color fons blau")) {
                         label.setBackground(Color.BLUE);
                    }
                    if (rButton.getText().equals(
                                          "Color text vermell")) {
                         label.setForeground(Color.RED);
                    }
                    if (rButton.getText().equals(
                                          "Color text verd")) {
                         label.setForeground(Color.GREEN);
                    }
                    if (rButton.getText().equals(
                                          "Color text blau")) {
                         label.setForeground(Color.BLUE);
                    }
            }
    }

}
 
     
  Cal que tingus en compte que l'objecte ButtonGroup és l'encarregat de controlar que, a cada moment, només hi hagi un sol dels seus objectes JRadioButton seleccionat. El fet d'afegir un objecte JRadioButton a un objecte ButtonGroup no té cap trascendència gràfica quant a la posició d'aquell (això cal seguir-ho fent afegint-lo a un contenidor amb el layout corresponent) sinó que serveix per posar-lo en relació amb els altres objectes JRadioButton del grup. El mètode corresponent és de la classe ButtonGroup i és:  
     
 
public void add(AbstractButton boto)
 
     
  La classe JRadioButton és filla de la classe AbstractButton, així que tot anirà bé. Ara et suggerim que suprimeixis totes les línies grupEst.add(...) i vegis què passa...  
     
  JComboBox  
     
  Aquest és un control per escollir una opció entre les que presenta una llista desplegable:  
     
 
 
     
  La classe que el representa és javax.swing.JComboBox i els mètodes constructors més importants són:  
     
 
  • public JComboBox(Object[] items)

  • public JComboBox(Vector items)
 
     
  on Object[] items i Vector items són, respectivament, una matriu i un vector que contenen els objectes que apareixeran al desplegable, normalment, cadenes de text.  
     
  Per saber quin dels ítems és el que està seleccionat a cada moment, la classe JComboBox té els mètodes:  
     
 
  • public int getSelectedIndex()

    que retorna l'índex (la posició, començant per 0) de l'item seleccionat, i

  • public Object getSelectedItem()

    que retorna l'objecte seleccionat dels de la llista.
 
  Si cal afegir items al desplegable, disposes d'aquests mètodes de la classe JComboBox:  
     
 
  • public void addItem(Object un_objecte)

    que, simplement, afegeix l'ítem un_objecte a la llista, i

  • public void insertItemAt(Object un_objecte, int posicio)

    que insereix l'ítem un_objecte a la llista, a la posició posicio.
 
     
  D'altra banda, si cal treure ítems de la llista, els mètodes de la classe JComboBox disponibles són:  
     
 
  • public void removeItem(Object un_objecte)

    que, simplement, elimina l'ítem un_objecte a la llista,

  • public void removeItemAt(int posicio)

    que elimina l'ítem que és a la posició posicio, i

  • public void removeAllItems()

    que elimina tots els ítems de la llista.
 
     
  Per saber el nombre d'ítems, el mètode és:  
     
 
public int getItemCount()
 
     
  Els objectes JComboBox emeten esdeveniments java.awt.event.ItemEvent i java.awt.event.ActionEvent quan la selecció canvia o hi ha canvis a la llista d'opcions. Aquests esdeveniments, com sempre, han d'ésser escoltats pels corresponents objectes java.awt.event.ItemListener i java.awt.event.ActionListener. Els mètodes de la classe JComboBox per afegir escoltadors dels esdeveniments que emeten són:  
     
 
  • public void addItemListener(ItemListener iL)

  • public void addActionListener(ActionListener aL)
 
     
Posa tot això en funcionament ara:  
     
 
 
     
 
  • En un objecte JFrame hi posaràs, a la posició sud (BorderLayout.SOUTH) un objecte JComboBox amb els ítems d'una matriu de cadenes de text que reprodueixen una sèrie de dites cadalanes.

  • A la posició central (BorderLayout.CENTER) hi posaràs un objecte JLabel, el qual, a cada moment, presentarà el text de la dita seleccionada a l'objecte JComboBox.
 
  Aquest n'és el codi:  
     
import javax.swing.JFrame;
import java.awt.Container;
import java.awt.Font;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
* Escriviu aquí una descripcìó de la classe ComboBoxes
*
* @author (el vostre nom)
* @version (un número de versió o la data)
*/
public class ComboBoxes extends JFrame implements ActionListener {

    /**
     * El Jlabel
     */
JLabel label;

    /**
     * La matriu de dites.
     */

    String[] dites={
        " Les cabres pels seus pecats, porten els genolls pelats ",
        " Pel maig, cada dia un raig ",
        " Caldera vella, bony o forat ",
        " Bon vent i barca nova ",
        " Qui dia passa any empeny ",
        " Cel rogenc, pluja o vent ",
        " Brams d'ase no arriben al cel ",
        " Si vols estar ben servit. fes-te tu mateixel llit ",
        " Feina feta no fa destorb ",
        " Tants caps tants barrets ",
        " A sants i a minyons, no prometis si no dons ",
        " No es pot matar tot el que és gras ",
        " Fent i desfent, aprèn l'aprenent ",
        " Com més cosins, més endins ",
        " Pagant, Sant Pere canta ",
        " Músic pagat fa mal so ",
        " Qui fa un cove, fa un cistell ",
        " Quan era mort el combregaren ",
        " Qui no té feina el gat pentina ",
        " Qui no s'arrisca, no pisca ",
        " Morta la cuca, mort el verí ",
        " De fora vingueren i de casa ens tragueren ",
        " Gent jove, pa tou ",
        " Qui té el cul llogat, no seu quan vol ",
        " Més pa que formatge "};

    /**
     * Mètode constructor per a objectes de la classe ComboBoxes
     */
    public ComboBoxes() {
        setTitle("Exemple amb ComboBox'es");
        Container cnt=getContentPane();

        label=new JLabel();
        // Fes que les lletres del label siguin diferents i
        // més grans:
        label.setFont(new Font("Serif",Font.BOLD,20));
        cnt.add(label,BorderLayout.CENTER);

        JComboBox comboBox=new JComboBox(dites);
        comboBox.addActionListener(this);
        cnt.add(comboBox,BorderLayout.SOUTH);

        int quin=comboBox.getSelectedIndex();
        label.setText(dites[quin]);

        pack();
        show();
    }

    /**
     * Mètode que s'executa quan l'objecte JComboBox emet un
     * ActionEvent, és a dir, quan hi ha canvis a la llista
     * d'ítems
     */

    public void actionPerformed(ActionEvent e) {
        JComboBox comboBox=(JComboBox)e.getSource();
        int quin=comboBox.getSelectedIndex();
        label.setText(dites[quin]);
    }

}
 
     
  En aquest codi, per saber quin és l'ítem seleccionat, es fa servir el mètode getSelectedIndex(), i el nombre que s'obté es fa servir per localitzar la dita adequada a la matriu. Però es podria fer servir el mètode getSelectedItem(), que torna directament l'objecte seleccionat:  
     
        <codi anterior>
        
cnt.add(comboBox,BorderLayout.SOUTH);
        label.setText((String)comboBox.getSelectedItem());

        pack();
        show();
}

    /**
     * Mètode que s'executa quan l'objecte JComboBox emet un
     * ActionEvent, és a dir, quan hi ha canvis a la llista
     * d'ítems
     */
    public void actionPerformed(ActionEvent e) {
        JComboBox comboBox=(JComboBox)e.getSource();

        String text=(String)comboBox.getSelectedItem();
        label.setText(text);
    }

}

 
     
  JComboBox'es editables:    
     
  Fins aquí, la llista d'ítems de l'objecte JComboBox és invariable. Però els ítems es poden fer editables: només cal afegir una crida al mètode de la classe JComboBox:  
     
 
public void setEditable(boolean es_editable)
 
     
  a continuació del constructor:  
     
<codi anterior>

    /**
     * Mètode constructor per a objectes de la classe ComboBoxes
     */
    public ComboBoxes() {
        setTitle("Exemple amb ComboBox'es");
        Container cnt=getContentPane();

        label=new JLabel();
        // Fes que les lletres del label siguin diferents i
        // més grans:
        label.setFont(new Font("Serif",Font.BOLD,20));
        cnt.add(label,BorderLayout.CENTER);

        JComboBox comboBox=new JComboBox(dites);
        comboBox.setEditable(true);
        comboBox.addActionListener(this);
        cnt.add(comboBox,BorderLayout.SOUTH);

        label.setText((String)comboBox.getSelectedItem());

        pack();
        show();
}
<codi següent>
 
     
  L'aspecte canvia:  
     
 
 
     
  La casella que mostra l'ítem seleccionat ara és editable, cosa que vol dir que podem canviar-hi el text a voluntat. El nou text, després de prémer la tecla "Retorn", és tractat com una opció més i, per tant, apareix al label, però aquí acaba tot, perquè no és incorporat a la llista d'opcions com a nova opció:  
     
 
 
     
  Si vols que el nou text quedi incorporat com a nova opció disponible, cal modificar el mètode actionPerformed:  
     
    /**
     * Mètode que s'executa quan l'objecte JComboBox emet un
     * ActionEvent, és a dir, quan hi ha canvis a la llista
     * d'ítems
     */
    public void actionPerformed(ActionEvent e) {
        JComboBox comboBox=(JComboBox)e.getSource();
        String text=(String)comboBox.getSelectedItem();

        // Quants ítems hi ha?
 
       int quants=comboBox.getItemCount();
        // De moment que inserti el text...
        boolean inserta=true;
        // Ara mirem si el text ja hi era, comparant-lo amb els
        // altres
            for (int i=0;i<quants;i++) {
                // El text que hi ha la posició i
                String elText=(String)comboBox.getItemAt(i);
                // Són iguals?
                    if (elText.equals(text)) {
                        // Sí, ho són: no l'insertis i para de
                        // buscar!
                        inserta=false;
                        break;
                    }
            }
        // Si has d'insertar, fes-ho. Això provoca l'emissió d'un
        // ActionEvent. Si no has d'insertar, simplement, posa el
        // text al label.
            if (inserta) {
                comboBox.insertItemAt(text,quants);
            } else {
                label.setText(text);
            }

    }
 
     
  En efecte, ara el nou text ja és una altra opció disponible:  
     
 
 
     
  JList  
     
  Si el que cal és escollir una o diverses opcions a la vegada d'una llista, aleshores, la classe adequada és javax.swing.JList.  
     
 
 
     
  Alguns mètodes de la classe JList són força similars als de la classe JComboBox. Els constructors més importants són:  
     
 
  • public JList(Object[] items)

  • public JList(Vector items)
 
  on, també, Object[] items i Vector items són, respectivament, una matriu i un vector que contenen els objectes que apareixeran a la llista, normalment, cadenes de text.  
     
  Per saber quins dels ítems són els que estan seleccionats a cada moment, la classe JList té els mètodes:  
     
 
  • public int getSelectedIndex()

    que retorna l'índex (la posició, començant per 0) del primer dels ítems seleccionats,

  • public int[] getSelectedIndices()

    que retorna una matriu amb els índexs (les posicions, començant per 0) dels ítems seleccionats,

  • public Object getSelectedValue()

    que retorna el primer dels objectes seleccionats dels de la llista, i

  • public Object[] getSelectedValues()

    que retorna una matriu amb els objectes seleccionats.
 
  Observa que, ara, com que la selecció pot ser múltiple, necessites una matriu i no un sol valor per disposar de la informació completa quant als ítems seleccionats.  
     
  Els objectes JList emeten esdeveniments javax.swing.event.ListSelectionEvent quan la selecció canvia. Aquests esdeveniments, com fins ara, (lesquema és sempre el mateix!), han d'ésser escoltats pels corresponents objectes javax.swing.event.ListSelectionListener. Els mètode de la classe JList per afegir escoltadors dels esdeveniments que emeten és:  
     
 
public void addListSelectionListener(ListSelectionListener lSl)
 
     

Ara es tracta de veure funcionar tot això. En un objecte JFrame, a la posició oest (BorderLayout.WEST), hi posaràs, un objecte JScrollPane, el qual contindrà un objecte JList, construït a partir de la mateixa llista de dites catalanes de l'exemple anterior. Cal posar sempre els objectes JList en el si d'un objecte JScrollPane, per tal que tot el contingut de la llista sigui accessible.

 
     
  A la posició centre (BorderLayout.CENTER) hi posaràs un altre objecte JScrollPane, el qual contindrà un objecte JTextArea. Això cal fer-ho així tal com està exposat a la pràctica 4. Es tracta que les dites seleccionades a l'objecte JList apareguin a l'objecte JTextArea:  
     
 
     
  El codi és aquest:  
     
import javax.swing.JFrame;
import java.awt.Container;
import java.awt.Font;
import javax.swing.JList;
import javax.swing.JTextArea;
import java.awt.BorderLayout;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
* Escriviu aquí una descripcìó de la classe Llistes
*
* @author (el vostre nom)
* @version (un número de versió o la data)
*/
public class Llistes extends JFrame implements
                                     ListSelectionListener {

    /**
     * El JTextArea
     */
    JTextArea textArea;

    /**
     * La matriu de dites.
     */

    String[] dites={
        " Les cabres pels seus pecats, porten els genolls pelats ",
        " Pel maig, cada dia un raig ",
        " Caldera vella, bony o forat ",
        " Bon vent i barca nova ",
        " Qui dia passa any empeny ",
        " Cel rogenc, pluja o vent ",
        " Brams d'ase no arriben al cel ",
        " Si vols estar ben servit. fes-te tu mateixel llit ",
        " Feina feta no fa destorb ",
        " Tants caps tants barrets ",
        " A sants i a minyons, no prometis si no dons ",
        " No es pot matar tot el que és gras ",
        " Fent i desfent, aprèn l'aprenent ",
        " Com més cosins, més endins ",
        " Pagant, Sant Pere canta ",
        " Músic pagat fa mal so ",
        " Qui fa un cove, fa un cistell ",
        " Quan era mort el combregaren ",
        " Qui no té feina el gat pentina ",
        " Qui no s'arrisca, no pisca ",
        " Morta la cuca, mort el verí ",
        " De fora vingueren i de casa ens tragueren ",
        " Gent jove, pa tou ",
        " Qui té el cul llogat, no seu quan vol ",
        " Més pa que formatge "};

    /**
     * Mètode constructor per a objectes de la classe ComboBoxes
     */

    public Llistes() {
        setTitle("Exemple amb List'es");
        Container cnt=getContentPane();

        textArea=new JTextArea();
        // Fes que les lletres del textArea siguin diferents i
        // més grans:
        textArea.setFont(new Font("Serif",Font.BOLD,20));
        textArea.setLineWrap(true);

        // Un JScrollPane per contenir el textArea
        JScrollPane jspText=new JScrollPane(textArea);
        cnt.add(jspText,BorderLayout.CENTER);

        JList llista=new JList(dites);
        llista.setSelectedIndex(0);
        llista.addListSelectionListener(this);

        // Un JScrollPane per contenir la llista
        JScrollPane jspLlista=new JScrollPane(llista);
        cnt.add(jspLlista,BorderLayout.WEST);

        // El text inicial
        textArea.setText((String)llista.getSelectedValue());

        pack();
        show();
    }

    /**
     * Mètode que s'executa quan l'objecte JList emet un
     * ListSelectionEvent, és a dir, quan se selecciona o es
     * deselecciona algun dels ítems de la llista
     */

    public void valueChanged(ListSelectionEvent e) {
        JList llista=(JList)e.getSource();
        // Recollida dels objectes seleccionats
        Object[] textos=llista.getSelectedValues();
        // Quants objectes seleccionats hi ha?
        int quants=textos.length;
        String text="";
            for (int i=0;i<quants;i++) {
                // Afegir aquest text
                text=text+(String)textos[i]+"\n";
            }
        textArea.setText(text);
    }

}
 
     
  Naturalment, com en el cas dels objectes JComboBox, en lloc de fer servir el mètode getSelectedValues(), es pot fer servir el mètode getSelectedIndices():  
     
<codi anterior>

        // El text inicial
        int[] indexos=llista.getSelectedIndices();
            if (indexos.length>0) {
                textArea.setText(dites[indexos[0]]);
            }

        pack();
        show();
    }

    /**
     * Mètode que s'executa quan l'objecte JList emet un
     * ListSelectionEvent, és a dir, quan se selecciona o es
     * deselecciona algun dels ítems de la llista
     */
    public void valueChanged(ListSelectionEvent e) {
        JList llista=(JList)e.getSource();
        // Recollida dels objectes seleccionats
        int[] indexos=llista.getSelectedIndices();
        // Quants objectes seleccionats hi ha?
        int quants=indexos.length;
        String text="";
            for (int i=0;i<quants;i++) {
                // Afegir aquest text

                text=text+dites[indexos[i]]+"\n";
            }
        textArea.setText(text);
    }

}
 
     
  amb resultat equivalent.  
     
  Un exercici:  
     

Et proposem que modifiquis el Visor de Fotos Xtra de la pràctica 3 de manera que l'elecció de la foto es faci mitjançant un objecte JComboBox. El funcionament ha de ser com el que veuràs quan facis clic aquí.

 
     
  La nostra solució és aquí (però no la miris encara!)  
     
    Tornar al principi