VP gang 6

Swing

Kig på "Creating a GUI with JFC/Swing" på http://java.sun.com/docs/books/tutorial/uiswing/TOC.html, der indeholder en nærmere beskrivelse af alle Swing-komponenterne.
Kristian Hansen: Avanceret Java-programmering har også nogle gode letforståelige eksempler (zippet her) på brug af Swing.
Andre introduktioner kan findes på http://developer.java.sun.com/developer/onlineTraining/

Swing og MVC

Herfra kan du hente eksemplerne fra kapitlet. Prøv dem.

Opgaver

Prøv eksempel: To tekstfelter deler samme dokument

Opret to tekstfelter i en Frame
        JTextField jTextField1 = new JTextField();
        JTextField jTextField2 = new JTextField();


og få dem til at redigere i den samme tekst ved at sætte den ene til at bruge den andens model:

                Document datamodel = jTextField1.getDocument();
                jTextField2.setDocument( datamodel );
NB: For at interfacet Document skal være kendt skal pakken javax.swing.text importeres (import javax.swing.text.*).
   

Prøv eksempel: Et tekstfelt der kun accepterer store store bogstaver

I stedet for at lave en implementation af Document-interfacet fra grunden vælger man ofte at arve fra standardmodellen (der hedder PlainDocument) og tilsidesætte en af den metode der indsætter tekst:
public class StortDokument extends PlainDocument
{
        public void insertString(int o, String s, AttributeSet a)
                throws BadLocationException
        {
                super.insertString(o, s.toUpperCase(), a);
                System.out.println("insertString("+o+", '"+s+"', "+a+")\n"); // log det
        }
}
 

Prøv at oprette og bruge et tekstfelt der bruger StortDokument som model:

                Document datamodel = new StortDokument();
                jTextField2.setDocument( datamodel );
(Udfordring: Kan du gøre det som en anonym klasse?)
 

Datamodellen for knapper

Prøv at lade to knapper dele datamodel. Hvad sker der så?

Hvad med en menuindgang og en knap?

Swing og tabeller

Prøv demoen SwingSet2 som følger med i JDKet.
Det ligger i jdk1.4/demo/jfc/SwingSet2 i JBuilders programkatalog.

Implementér din egen datamodel for JTable

Interfacet ligger i pakken javax.swing.table og ser sådan her ud:
public interface TableModel
{
    public int getRowCount();
    public int getColumnCount();
    public String getColumnName(int columnIndex);
    public Class getColumnClass(int columnIndex);
    public boolean isCellEditable(int rowIndex, int columnIndex);
    public Object getValueAt(int rowIndex, int columnIndex);
    public void setValueAt(Object aValue, int rowIndex, int columnIndex);
    public void addTableModelListener(TableModelListener l);
    public void removeTableModelListener(TableModelListener l);
}

Prøv også at arve fra AbstractTableModel, der er en implementation af TableModel. Eksempelvis:

public class Titabel extends AbstractTableModel
{
public int getColumnCount() { return 10; }
public int getRowCount() { return 10;}
public Object getValueAt(int row, int col) { return new Integer(row*col); }
}