Java2 1.5: Graphical User Interface: Swing

  1. Inleiding
  2. Applets en Frames - WindowListener - AdapterKlassen
  3. Concrete voorbeelden - ActionListener
  4. Swing componenten: hoofdniveau containers
  5. Swing componenten: algemene containers
  6. Swing componenten: speciale containers
  7. Swing componenten: basiscomponenten

    JButton | JCheckBox | JRadioButton | JTextField | JComboBox
    JList | JSlider | JSpinner | JTextArea | JProgressBar | JTable

  8. Layouts

    Flow | Box | Border | Card |

Inleiding

Swing en AWT

Voor het maken van applets en toepassingen met een grafische omgeving (GUI: Graphical User Interface) maak je best gebruik van Swing-componenten.

Swing is een set pakketten die voortbouwen op de vroegere AWT (Abstract Windowing Toolkit). In AWT bestonden dus reeds heel wat componenten die nu een parallelle tegenhanger hebben in Swing.

Daar Swing gebaseerd is op AWT kunnen we er voor de cursus niet omheen, en zullen dus ook heel wat AWT-begrippen aan bod komen.

Swing maakt zelf deel uit van de JFC (Java Foundation Classes), deze omvatten:

Voor het maken van GUI-toepassingen met Java zijn volgende begrippen van heel groot belang:
Begrip Beschrijving
Component De elementen die dienen voor de gebruikersinterface: drukknoppen, keuzelijsten, selectierondjes, tekstvakken, labels, ...
Container Vensters (JFrame, JApplet) of panelen (JPanel) die componenten kunnen bevatten.
Layout Bepalen de schikking van componenten in een container
Listener Worden aan componenten gekoppeld om gebeurtenissen te kunnen afhandelen, met behulp van listeners kan je code schrijven die moet worden uitgevoerd als een knop wordt ingedrukt, een keuze in een lijst wordt gemaakt, ...

Swing componenten

Daar Swing deel uitmaakt van de JFC beginnen de namen van Swing-componenten met een J:

component beschrijving
JApplet Uitgebreide versie van java.applet.Applet met ondersteuning voor panelen
JFrame Uitgebreide versie van java.awt.Frame met ondersteuning voor panelen
JLabel Label
JButton Opdrachtknop
JList Keuzelijst
en nog veel meer...
De klassen die de basis vormen voor applets en toepassingen JApplet en JFrame hebben een kind-object dat al het grafische werk verricht, en dit object is van de klasse JRootPane. In vroegere AWT-toepassingen kon je componenten rechtstreeks aan appplets of frame-vensters toevoegen.

Met Swing ligt het iets complexer:

Het JRootPane bestaat in principe uit twee andere panelen: een glassPane en een layeredPane. Het glassPane is verantwoordelijk voor het opvangen van muisgebeurtenissen. Het layeredpane bevat een contentPane (inhoud) en een menubalk.
Concreet betekent dit dat wanneer we straks componenten teovoegen aan een applet of frame-toepassing deze elementen aan de contentPane van JRootPane worden toegevoegd.

De eigenlijke componenten die dan aan het paneel toevoegt zijn afgeleid van de klasse JComponent.

Applets en Frames (venstertoepassingen)

De gebruikte Java-editor noteert in de automatisch gegenereerde code de volledige naam van een klasse, met namespace en pakket-aanduiding. Dit kan manueel natuurlijk een stuk korter met de nodige import-statements bovenaan de code.

Swing applet

Je kan Swing-applets maken op basis van de JApplet-klasse. Deze klasse wordt een zwaargewicht-klasse genoemd daar deze een uitbreiding vormt op de AWT-klasse Applet.

Het tekenen van inhoud gebeurt in de JRootPane-klasse die een veld is van de JApplet-klasse.

Voor het maken van de voorbeelden maak ik gebruik van de editor NetBeans IDE. Door een editor te gebruiken hoef je vele stukken code niet in te tikken.

De code die voor de voorbeelden irrelevant is (zoals automatisch gegenereede commentaar) is hier veelal weggelaten.

Download dit voorbeeld in zip-formaat


public class Alabel extends javax.swing.JApplet {
    
    public void init() {
        initComponents();
    }
    
    private void initComponents() {
        jLabel1 = new javax.swing.JLabel();

        getContentPane().setLayout(new java.awt.FlowLayout());

        jLabel1.setText(""Groeten van Swing"");
        getContentPane().add(jLabel1);

    }
    
    
    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    // End of variables declaration
    
}

De klasse die we maakten is afgeleid van de javax.swing.JApplet-klasse: we maken een applet met Swing-functionaliteiten.

De init-methode bevat voor een Applet de code die eerst moet worden uitgevoerd.
In de methode init roepen we onmiddellijk de methode initComponents op: deze bevat de code voor het plaatsen van de componenten op de Applet (gemakkelijk doordat deze code door NetBeans IDE wordt gegenereerd wanneer je de form-editor gebruikt).

Binnen de methode initComponents maken we een nieuwe instantie van de klasse JLabel aan: een label.

De methode getContentPane van de klasse JApplet laat je toe het inhoudspaneel (container) te benaderen.

We zorgen ervoor dat dit paneel de FlowLayout gebruikt, alle componenten zullen gewoon naast elkaar worden getoond. Meer over layouts verderop in de cursus.

De setText-methode van een JLabel wordt toegepast om de tekst die in het JLabel moet worden geplaatst in te stellen.

Het label wordt toegevoegd aan het contentPane met de methode add.

Swing frame-applicatie

Download dit voorbeeld in zip-formaat

public class Flabel extends javax.swing.JFrame {
    
    public Flabel() {
        initComponents();
    }
    
    private void initComponents() {
        jLabel1 = new javax.swing.JLabel();

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jLabel1.setText("Groeten van Swing");
        getContentPane().add(jLabel1);

        pack();
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new Flabel().show();
    }
    
    
    private javax.swing.JLabel jLabel1;
    
 
}

De eerste routine die wordt opgestart in een vensterapplicatie is de main-methode. Hier maken we met het sleutelwoord new een instantie van de klasse Flabel en tonen die op het scherm met de methode show.

public static void main(String args[]) {
        new Flabel().show();
    }

Bij het maken van de instantie van onze klasse wordt de constructor van de klasse uitgevoerd:

public Flabel() {
        initComponents();
    }

De constructor laat de methode initComponents uitvoeren: de plaats waar we ervoor zorgen dat de juiste componenten op het formulier geplaatst worden.

private void initComponents() {
        jLabel1 = new javax.swing.JLabel();

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jLabel1.setText("Groeten van Swing");
        getContentPane().add(jLabel1);

        pack();
    }

De pack-methode van de klasse Window zorgt ervoor dat het venster zich aanpast aan de grootte van de componenten.

Er werd ook een routine voorzien voor het correct aflsluiten van het programma bij het sluiten van het venster:

addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

Met de methode addWindowListener van de klasse Window kan je ervoor zorgen dat je gebeurtenissen zoals sluiten, openen, activeren, deactiveren van het venster kan opvangen.

Aan de methode addWindowListener moet je een object van het type WindowListener doorgeven

WindowListener is een interface: een klasse waarin enkel methoden gedeclareerd zijn maar niet uitgewerkt, we moeten zelf de code hiervoor schrijven.

Als je de WindowListener-interface implementeert (met het sleutelwoord implements na een klassenaam) ben je verplicht alle methoden van die klasse te implementeren en bezorg je jezelf heel wat werk (de interface WindowListener heeft 7 methoden).

Wij zijn enkel geïnteresseerd in de methode windowClosing van de interface WindowListener.

Gelukkig bestaan er in Java Adapterklassen: deze klassen implenteren een (of meerdere) interfaces, en implementeren alle methodes ervan, maar zonder opvulling: allen lege methodes !

Het leuke is nu dat wanneer we een instantie van die adapterklasse maken we alle methoden van de interface reeds geïmplementeerd hebben (in de adapterklasse) en dat we nu de methoden die we zelf wensen te gebruiken kunnen overriden.

In het bovenstaande voorbeeld gebruiken we hiervoor een anonieme binnenklasse die als supertype WindowAdapter heeft. Deze klasse implementeert onder meer de interface WindowListener die wij nodig hebben. In onze klasse overriden we de methode windowClosing van de adapterklasse met onze eigen opvulling.

public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }

We geven de methode een opvulling zondanig dat onze methode exitForm wordt uitgevoerd. We geven het WindowEvent - het object dat de gegevens van de gebeurtenis bevat, in ons geval het sluiten van het formulier - mee onder de naam evt. In de methode exitForm staat de opdracht om het programma af te sluiten:

private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

Het label jLabel1 is overal in deze klasse steeds bereikbaar:

private javax.swing.JLabel jLabel1;
Dit stuk code staat in het voorbeeld onderaan (gegenereerd door NetBeans IDE) maar kan gerust onmiddellijk na de klassedeclaratie komen.

Concrete voorbeelden

We maken een aantal toepassingen om het werken met Swing te leren kennen.

Je kan voor de toepassingen een zip-bestand downloaden, dit bestand bevat de java- en .class-bestanden. Er zijn ook eventuele andere bestanden aanwezig (figuren) en .form-bestanden voor de NetBeans IDE. Op deze manier kan je deze voorbeelden gemakkelijk in een nieuw NetBeans project gebruiken met form-editor.

Aantal keer klikken tellen

Download dit voorbeeld in zip-formaat

import javax.swing.*;          

public class Fknop extends javax.swing.JFrame {
    public static int aantalklik = 0;
    private static String labelPrefix = "Aantal klikken: ";
    
    public Fknop() {
        initComponents();
    }
    
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();

        setTitle("Kliken op een knop");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS));

        jPanel1.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(10, 10, 10, 10)));
        jPanel1.setPreferredSize(new java.awt.Dimension(200, 100));
        jButton1.setText("Klik me");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jPanel1.add(jButton1);

        jLabel1.setPreferredSize(new java.awt.Dimension(0, 50));
        jPanel1.add(jLabel1);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        pack();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        aantalklik++;
        jLabel1.setText(labelPrefix + aantalklik);
    }
    
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
    
    public static void main(String args[]) {
        new Fknop().show();
    }
    
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration
    
}

We geven het JFame een titel:

	setTitle("Kliken op een knop");

JPanel1 gebruikt een BoxLayout, zie verderop
JPanel1 krijgt een EmptyBorder - lege rand (afstand tot de rand): aan de vier zijden 10px - afmetingen worden geregeld met Insets.
JPanel1 krijgt een voorkeursafmeting van 200 bij 100px.
Het hoofdpaneel (ContentPane) krijgt een BorderLayout, zie verderop.

We gebruiken een ActionListener om het klikken op de knop te kunnen afhandelen.

We doen dit opnieuw door gebruik te maken van een anonieme binnenklasse die als supertype de interface ActionListener heeft (uit het java.awt.event-pakket).

jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

Deze keer hoeven we geen Adapterklasse (zie hierboven) te gebruiken die reeds alle methoden van de interface implementeert, want de interface ActionListener heeft slechts 1 methode: actionPerformed. Deze methode wordt dus geïmplementeerd in onze anonieme binnenklasse.

In de implementatie van de methode roepen we de eigen methode jButton1ActionPerformed waaraan we het ActionEvent-object onder de naam evt doorgeven.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        aantalklik++;
        jLabel1.setText(labelPrefix + aantalklik);
    }
In de methode verhogen we de variabele aantalklik met 1 en stellen we de tekst van het label opnieuw in.

Implementeren van de interface ActionListener, ander methode:

Je kan in de klasse FKnop de interface ActionListener implementeren en in de klasse een methode actionPerformed(ActionEvent evt) voorzien.

...
public class Fknop extends JFrame implements ActionListener{
...
	public void actionPerformed(ActionEvent evt){
	...
	}
...
}

Wanneer je nu echter met meerdere componenten te maken hebt die de ActionListener gebruiken, moet je binnen de methode actionPerformed de bron van de gebeurtenis kunnen vaststellen (op welke knop werd er geklikt?). Dit kan je met de getSource-methode van het ActionEvent-object:

...

if(evt.getSource()=jButton2){...}

...

Temperatuursconversie Celsius - Fahrenheit

Download dit voorbeeld in zip-formaat

public class Ftempconversie extends javax.swing.JFrame {
    
    public Ftempconversie() {
        initComponents();
    }
    
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        tempCelsius = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        fahrenheitlabel = new javax.swing.JLabel();

        setTitle("Temperatuur omzetten C - F");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setLayout(new java.awt.GridLayout(2, 2, 10, 10));

        tempCelsius.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                actie(evt);
            }
        });

        jPanel1.add(tempCelsius);

        jLabel1.setText("Celsius");
        jLabel1.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(5, 5, 5, 5)));
        jPanel1.add(jLabel1);

        jButton1.setText("Converteer");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                actie(evt);
            }
        });

        jPanel1.add(jButton1);

        fahrenheitlabel.setText("Fahrenheit");
        fahrenheitlabel.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(5, 5, 5, 5)));
        jPanel1.add(fahrenheitlabel);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        pack();
    }

    private void actie(java.awt.event.ActionEvent evt) {
        int tempFahr = (int)((Double.parseDouble(tempCelsius.getText()))  
                         * 1.8 + 32);
    	fahrenheitlabel.setText(tempFahr + " Fahrenheit");

    }
    

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
    
    public static void main(String args[]) {
        new Ftempconversie().show();
    }
    
    // Variables declaration - do not modify
    private javax.swing.JLabel fahrenheitlabel;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField tempCelsius;
    // End of variables declaration
    
}

In deze toepassing kan de gebruiker een waarde ingeven in een tekstvak. Wanneer de gebruiker op enter drukt in het tekstvak tempCelsius of op de knop jButton1 drukt berekenen we de temperatuur in Fahrenheit en zetten het resultaat in het label fahrenheitlabel.

Deze keer zullen dus twee acties hetzelfde resultaat hebben: drukken op enter in het tekstvak en klikken op de knop.

We zorgen er dus voor dat beide componenten de ActionListener-interface implementeren en de methode actionPerformed bevatten. We zorgen er dan voor dat beide acties dezelfde methode actie uitvoeren: we gaan het omzetten van de temperatuur toch geen twee keer programmeren.

Het eigenlijke omzetten van de temperatuur gebeurt dus in de methode actie:

private void actie(java.awt.event.ActionEvent evt) {
        int tempFahr = (int)((Double.parseDouble(tempCelsius.getText()))  
                         * 1.8 + 32);
    	fahrenheitlabel.setText(tempFahr + " Fahrenheit");

    }

Met de methode getText lezen we de inhoud van het tekstvak tempCelsius. We zetten de waarde om in een Double met behulp van de methode parseDouble van de Double-klasse. De methode getText levert een String-waarde, hiermee kunnen we niet rekenen! We voeren daarna de berekening uit ( *1.8 +32) en typecasten het resultaat tot een int (geheel getal).

Swing-componenten: hoofdniveau containers

In dit en volgende onderdelen krijg je een overzicht van de componenten die je kan gebruiken met Swing.

De aangegeven methoden zijn beschikbaar voor de component maar kunnen overgeërfd zijn uit een superklasse. Er zijn voor deze componenten nog heel wat meer methoden beschikbaar, bekijk indien nodig de Sun API door op de naam van de component te klikken. Deze componenten vormen het hoofdniveau van een Swing-toepassing

Component Beschrijving Belangrijkste methoden
JApplet Een Java-applet (voor invoeging in een webpagina)
init wordt 1 keer uitgevoerd wanneer de Applet geladen is
start wordt uitgevoerd na init en telkens wanneer de Applet opnieuw op het scherm verschijnt (wanneer de gebruiker bv. naar een andere pagina surft en terugkeert)
stop wordt wanneer de browser naar een andere pagina gaat
destroy wanneer de applet op het punt staat uit het geheugen te worden verwijderd
paint wanneer de Applet hertekend moet worden
getContenPane retourneert het ContentPane voor deze Applet
setLayout Stelt de gebruikte Layout Manager in
JFrame Een applicatie-venster
getContenPane retourneert het ContentPane voor deze Applet
setLayout Stelt de gebruikte Layout Manager in
pack Stelt het venster in op de gewenste grootte en schikt de componenten
JOptionPane Een standaarddialoogvenster
showMessageDialog Toont een bericht
showInputDialog Toont een invulvenster
showConfirmDialog Vraagt om bevestiging
showOptionDialog Configureerbaar dialoogvenster
showInternalMessageDialog Lichtgewicht-versie
showInternalInputDialog Lichtgewicht-versie
showInternalConfirmDialog Lichtgewicht-versie
showInternalOptionDialog Lichtgewicht-versie
JDialog Een aangepast dialoogvenster  
Er zijn nog meer geavanceerde technieken voor het werken met OptionPanes.

Swing-componenten: algemene containers

De volgende container-componenten kan je voor heel wat verschillende doeleinden gebruiken in een toepassing:

Component Beschrijving Belangrijkste methoden
JPanel Een container voor het groeperen van componenten, is meestal doorzichtig, kan een rand hebben. Heeft zijn eigen layout manager (standaard flow-layout)
add Een component aan het JPanel toevoegen
remove Een component verwijderen
getComponenCount Het aantal componenten in het JPanel (int)
JScrollPane Een paneel met scrollmogelijkheid, waarin je een andere component (client) zoals een JList, JTextArea kan laten scrollen. Een veelgebruikte methode is
setViewportView(Component)
Hiermee geef je aan welke component scrollmogelijkheid moet hebben als je dat niet hebt gedaan in de constructor van de JScrollPane.

Meer bij Sun

JSplitPane Toont twee componenten met een splitsbalk ertussen Meer bij Sun
JTabbedPane Component om verschillende andere componenten (meestal JPanels) zichtbaar te maken met behulp van tabbladen Meer bij Sun
JToolBar Een menubalk die meestal JButton-componenten bevat Meer bij Sun

Swing-componenten: speciale containers

De volgende container-componenten kan je voor speciale doeleinden gebruiken in een toepassing:

Component Beschrijving Belangrijkste methoden
JInternalFrame Een container om een venster binnen een venster te maken (zoals het openen van meerdere documenten in bepaalde programma's zoals tekstverwerkers). Meer bij Sun
JLayeredPane Een container met een derde dimensie zodat componenten mekaar kunnen bedekken of overlappen Meer bij Sun
JRootPane Paneel dat standaard aanwezig is in een JFrame, JDialog, JApplet en JInternalFrame Meer bij Sun

Swing-componenten: basiscomponenten

De volgende componenten vormen de basiscomponenten voor interactiviteit met de gebruiker.

Component Beschrijving Belangrijkste methoden
JButton Een opdrachtknop, kan tekst en / of een icoon bevatten
btn = new JButton(t) Een knop met tekst t
btn = new JButton(img) Een knop met figuur img
btn = new JButton(t,img) Een knop met tekst t en figuur img
addActionListener Routine voor het afhandelen van het klikken op de knop.
Interface ActionListener, te implementeren: actionPerfomed
setEnabled Knop kan wel / niet aangeklikt worden
JCheckBox Een aankruisvakje met tekst erbij
cb = new JCheckBox(t) Aankruisvakje met tekst t ernaast, niet aangekruist
cb = new JCheckBox(t, bool) Aankruisvakje met tekst t ernaast, aangekruist als bool true is
addItemListener Routine voor het opvangen van aan of uitzetten van een aankruisvakje.
Interface ItemListener, te implementeren: itemStateChanged
isSelected Retourneert een boolean variabele met de status van het aankruisvakje: aangevinkt / niet aangevinkt
setSelected(bool) Zet de status van het aankruisvakje op aangevinkt / niet aangevinkt
JRadioButton Een selectierondje met tekst erbij
cb = new JRadioButton,(t) Selectierondje met tekst t ernaast, niet geselecteerd
cb = new JRadioButton(t, bool) Selectierondje met tekst t ernaast, geselecteerd als bool true is
addItemListener Routine voor het opvangen van aan of uitzetten van een selectierondje.
Interface ItemListener, te implementeren: itemStateChanged
isSelected Retourneert een boolean variabele met de status van het slectierondje: geselcteerd / niet geselecteerd
setSelected(bool) Zet de status van het selectierondje op geselecteerd / niet geselecteerd
ButtonGroup Een groep van selectierondjes (zodanig dat er slechts 1 element geselecteerd kan zijn).
bgroup = new ButtonGroup() Maak een groep voor selectierondjes
add(JRadioButton rb) Een selectierondje aan de groep toevoegen
JRadioButton rb = bgroup.getSelectedJRadioButton() Retourneert het actieve selectieronje
bgroup.setSelectedJRadioButton(rb) Maakt een opgegeven selectierondje binnen een groep actief
Meer over buttons, checkboxen en radiobuttons bij Sun
JTextField Een tekstvak, erf over van JTextComponent
JTextField tf = new JTextField(int k); Maak een tekstvak met een breedte (ongeveer) gelijk aan k, deze breedte is niet exact doordat niet alle letters in verschillende lettertypes evenveel plaats innemen
JTextField tf = new JTextField(String t); Een tekstvak waarin een stuk tekst t staat
JTextField tf = new JTextField(String t, int k); Tekstvak met de tekst t en (ongeveer) een breedte voor k tekens
addActionListener Routine uitgevoerd wanneer op enter wordt gedrukt in het tekstvak.
Interface ActionListener, te implementeren: actionPerfomed
setText(tekst) De tekst in het tekstvak instellen
setEditable(bool) Kan de tekst bewerkt worden?
setFont(f) Stel het lettertype in voor het tekstvak
setHorizontalAlignment(align) Stel de horizontale uitlijning in voor het tekstvak
Mogelijke waarden zijn JTextField.LEFT (standaard), JTextField.CENTER, or JTextField.RIGHT.
requestFocus() Geef het element de focus
Meer over JTextField maar ook JFormattedTextField en JPasswordField bij Sun
JComboBox Een keuzelijst met / zonder (standaard) invoervak
JComboBox keuze = new JComboBox() Je kan ook een array van Stringwaarden meegeven om de combobox initieel te vullen.
addActionListener Routine uitgevoerd wanneer een keuze uit de lijst wordt gemaakt of op enter wordt gedrukt in het ivoervak bij een keuzelijst met invoervak.
Interface ActionListener, te implementeren: actionPerfomed
setSelectedIndex(index) Selecteer het element op positie index in de lijst
setSelectedItem(object) Selecteer het aangegeven object in de lijst
addItem(item) Voeg een item toe aan de lijst
insert(item,index) Voeg een element in de lijst toe na index
remove(item) Verwijdert item uit de lijst
remove(index) Verwijdert item op positie index uit de lijst
getSelectedIndex() Retourneert de index van het geselecteerde item uit de lijst
getSelectedItem() Retourneert het geselecteerde item uit de lijst
setEditable(bool) Als bool true is wordt de keuzelijst een keuzelijst met invoervak
Meer over JComboBox bij Sun
JList Een keuzelijst waarbij meerdere items op het scherm zichtbaar zijn

Wens je te kunnen scrollen in de lijst, dan plaats je de Jlist in een JScrollPane

Standaard is een JList statisch: je kan geen elementen toevoegen en verwijderen. Wens je een dynamische lijst te maken, dan koppel je een de Jlist aan een lijstmodel zoals DefaultListModel.

JList lijst = new JList() Je kan ook een array van Stringwaarden of een Vector meegeven om de listbox initieel te vullen.
addListSelectionListener Actie ondernemen wanneer een waarde wordt geselecteerd. Interface ListSelectionListener met de methode valueChanged
setSelectionMode Kan je slechts 1 waarde selecteren, meerdere aaneengesloten waarden of ook los van elkaar gelegen items?
ListSelectionModel.SINGLE_SELECTION
ListSelectionModel.SINGLE_INTERVAL_SELECTION
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
setModel Stelt een lijstmodel in om een dynamische lijst te maken:
DefaultListModel model = new DefaultListModel();
lijst = new JList();
lijst.setModel(model);
		
setSelectedIndex(index) Selecteer het object met aangegeven index
ensureIndexIsVisible(index) Zorg ervoor dat het item met aangegeven index zeker zichtbaar is
insert(item,index) Voeg een element in de lijst toe na index
getSelectedIndex() Retourneert de index van het geselecteerde item uit de lijst, -1 indien geen selectie
getSelectedIndices() Retourneert een array met de indices van de geselecteerde items
getSelectedValue() Retourneert de eerste geselecteerde waarde of null als er geen item geselecteerd is
getSelectedValues() Retourneert een array met de waarden van de geselecteerde items
Methoden voor een lijstmodel :
JList lijst = new JList(new DefaultListModel()) Constructor voor een JList met een lijstmodel
getSize() Retourneert het aantal elementen
addElement Voeg een element toe
remove(index) Verwijder element met aangegeven index
getElementAt(index) Retourneert het element met aangegeven index
clear() Maak de lijst leeg
Meer over JList bij Sun
JSlider Een JSlider stelt de gebruiker in staat via een schuifregelaar waarden te zien of in te stellen.
JSlider slider = new JSlider() Maakt een JSlider met minimumwaarde 0, maximumwaarde 100 en standaardwaarde 50.
addChangeListener Actie ondernemen wanneer de waarde van de JSlider wordt veranderd. Interface ChangeListener met de methode stateChanged
setMajorTickSpacing Een integer waarde waarmee je de intervalwaarde tussen de grote scheidingsstrepen bepaalt
setMinorTickSpacing Een integer waarde waarmee je de intervalwaarde tussen de kleine scheidingsstrepen bepaalt
setPaintTicks Boolean die aangeeft of de streepjes moeten worden getoond
setPaintLabels Boolean die aangeeft of de labels bij de Slider moeten worden getoond
setMinimum Ondergrens instellen met een integer
setMaximum Bovengrens instellen met een integer
setSnapToTicks Boolean die aangeeft of de slider zich moet vasthechten aan de intervalstreepjes, zodanig dat geen tussenliggende waarde kan worden geselecteerd.
setOrientation Orientatie van de JSlider: JSlider.HORIZONTAL of JSlider.VERTICAL
getValueIsAdjusting Retourneert true als de gebruiker de waarde nog aan het instellen is (muisknop ingedrukt), anders false.

Dit kan je gebruiken als je enkel geïnteresseerd bent in de eindwaarde die de gebruiker instelt.

Meer over JSlider bij Sun
JSpinner Een JSpinner wordt gebruikt als een JList of JCombobox, wanneer slechts 1 waarde zichtbaar moet zijn. Een JSpinner bestaat standaard uit drie subcomponenten: een editor en twee kleine knoppen. De editor is standaard een JPanel met een JFormattedTextField. De waarden van een JSpinner worden gemanipuleerd via het model van de JSpinner.
JSpinner spinner = new JSpinner(); Maakt een JSpinner met een integer SpinnerNumberModel met initiële waarde 0 en geen minimum of maximumlimiet.
JSpinner spinner = new JSpinner(SpinnerModel); Maakt een JSpinner met het aangegeven SpinnerModel

Standaard beschik je over drie SpinnerModels:

  • SpinnerListModel: de waarden worden bepaald door een Array van objecten of een Lijst.
  • SpinnerNumberModel: numerieke waarden van het type double, int of Number. Je kan minimum- en maximumwaarde aangeven en de stapgrootte.
  • SpinnerDateModel: gebruikt datumgegevens
Wanneer je één van bovenstaande modellen gebruikt wordt de editor van de JSpinner automatisch ingesteld: er wordt gezorgd dat je geen onmogelijke waarden kan ingeven. De klassen JSpinner.ListEditor, JSpinner.NumberEditor, en JSpinner.DateEditor - allen subklassen van JSpinner.DefaultEditor - worden hiervoor gebruikt.
addChangeListener Actie ondernemen wanneer de waarde van de JSpinner wordt veranderd. Interface ChangeListener met de methode stateChanged
getValue Toont de huidige waarde van het model
getNextValue Toont de volgende waarde van het model
getPreviousValue Toont de vorige waarde van het model
Meer over JSpinner bij Sun
JTextArea Tekstgebied voor meer dan één regel tekst, al dan niet editeerbaar. Erft over van JTextComponent.
JTextArea ta = new JTextArea(); Maakt een nieuw tekstgebied, je kan in de constructor ook een begintekst (String) en/of aantal rijen (int) , aantal kolommen (int) meegeven.
append Voeg een String toe aan de JTextArea
getText De inhoud van de JTextArea (is een methode van JTextComponent)
getDocument Het model voor de editor (is een methode van JTextComponent)
selectAll Selecteer de volledige inhoud (is een methode van JTextComponent)
setEditable Boolean die aangeeft of het tekstgebied editeerbaar is (is een methode van JTextComponent)
setFont Stelt het lettertype in
setLineWrap Stelt in of de tekst afgebroken wordt naar een nieuwe regel
setWrapStyleWord Wanneer LineWrap op true werd ingesteld kan je met deze methode instellen dat er enkel mag afgebroken worden tussen woorden, niet binnen een woord.
Meer over JTextArea bij Sun
Bekijk ook de mogelijkheden van JEditorPane en JTextPane
JProgressBar Voortgangsbalk
JProgressBar pb = new JProgressBar(); In de constructor kan je ook aangeven: oriëntatie (JProgressBar.VERTICAL of JProgressBar.HORIZONTAL), min- en maxwaarde.
setValue Stel de waarde in voor de JProgressBar. Deze waarde wordt visueel voorgesteld.
setStringPainted Geef met een boolean aan of er een voortgangstekst moet worden getoond
setString Stel de voortgangstekst in
Meer over JProgressBar bij Sun
JTable Tabel
JTable tbl = new JTable(); Maak een tabel met een DefaultTableModel

Leer meer over JTable in het hoofdstuk GUI Swing toepassingen.

Meer over JTable bij Sun

Werken met layout managers

Bovenstaande componenten kan je gebruiken in JFrame of JApplet toepassing. Je zal wellicht bij het maken van je eerste Java GUI-toepassingen merken dat het plaatsen van de verschillende componenten, en de positionering van de componenten ten opzichte van elkaar niet vanzelfsprekend is.

De positionering van componenten kan je instellen via de LayOut van een container-component zoals een JFrame, JApplet of JPanel.

Java beschikt standaard over een aantal Lay-out managers die de schikking van de componenten bepalen en waarbij je als gebruiker een aantal instellingen kan doen. De layout-manager klassen maken deel uit van het pakket java.awt.

Het is steeds een goed idee om componenten in JPanels te stoppen en niet rechtstreeks op een JFrame of JApplet te plaatsen. Een JPanel heeft standaard een FlowLayout.

Je kan de layout van bijvoorbeeld een JPanel codematig instellen met de methode setLayout

FlowLayout

De eenvoudigste layout is FlowLayout: alle componenten worden in een rij geplaatst, er wordt een nieuwe rij gestart wanneer de container niet breed genoeg is.

Je kan een uitlijning en/of een horizontale en vertikale afstand meegeven in de constructor.

jPanel1.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));

Na aanpassing van het vensterformaat wordt dit bvb. :

BoxLayout

Bij een BoxLayout worden componenten geplaatst in een rij of een kolom.

Vaak kan je met een aantal JPanels met een BoxLayout componenten mooi schikken zonder ingewikkeldere layouts te gebruiken.

BoxLayout houdt rekening met de ingestelde minimum, maximum en preferred size van de componenten.

Bij een boxlayout volgens Y-axis (BoxLayout.Y-AXIS) -met de componenten onder elkaar- kan je de horizontale uitlijning beïnvloeden met de methode setAlignmentX:

Bij een boxlayout volgens X-axis (BoxLayout.X-AXIS) -met de componenten naast elkaar- kan je de vertikale uitlijning beïnvloeden met de methode setAlignmentY:

BoxLayout waarbij de componenten een AlignmentX van 0.5 hebben:

Ruimte tussen componenten kan worden gemaakt met mehoden uit de klasse Box:

Een voorbeeld van het gebruik van BoxLayout:

Het JLabel en de JList (in een JScrollPane) zijn vervat in een JPanel met BoxLayout volgens Y-axis. Tussen het label en de list is een rigid area aangebracht.

De twee knoppen zijn vervat in een JPanel met een BoxLayout volgens X-axis. Voor de eerste knop is horizontal glue opgenomen, tussen de twee knoppen een rigid area. Wanneer je de afmetingen van het venster aanpast zullen de twee knoppen even ver van elkaar blijven staan, maar ze zullen door de horizontal glue aan de linkerkant van de knoppen steeds mooi onder de rechterbenedenhoek van de JList blijven.

Het JFrame heeft ook een BoxLayout met twee JPanels volgens Y-axis.

Download dit voorbeeld in zip-formaatToon /verberg

Met NetBeans IDE plaats ik de rigid area of glue in de pre-init code (properties, onderdeel code) van de component die erna wordt getoond.

Meer over BoxLayout bij Sun

BorderLayout

Een BorderLayout staat je toe componenten als volgt te schikken:

De notatie met de windrichtingen is de naamgeving van voor Java 1.4 maar kan nog steeds gebruikt worden.

Horizontale en verikale 'witruimte' kan je aangeven met horizontal en vertical gap, deze integer waarden kan je meegeven in de constructor van de BorderLayout of instellen met de methoden setHgap en setVgap.

Download dit voorbeeld in zip-formaatToon /verberg

Meer over BorderLayout bij Sun

CardLayout

Met een CardLayout kan je ervoor zorgend dat componenten een plaats 'delen' in de toepassing. Je kan de componenten op gepaste momenten in de toepassing zichtaar of onzichtbaar maken.

In de praktijk plaats je een JPanel op de toepassing met een CardLayout, in het voorbeeld heeft dit JPanel de naam kaarten.
In dit JPanel plaats je dan JPanels die elkaar bedekken. Je voegt ze toe met de methode add van het overkoepelende JPanel, hierbij ken je de deelpanels een 'kaartnaam' toe (String).
De keuze voor het betreffende JPanel kan in de voorbeeldtoepassing worden aangegeven met een JComboBox.
Via de CardLayout kan je met de methode show meegeven welke de container is (hier het JPanel kaarten) en welke kaart moet worden getoond (String).

Download dit voorbeeld in zip-formaatToon /verberg

Met een JTabbePane kan je een vergelijkbare opmaak maken zonder gebruik te maken van een CardLayout.

Meer over CardLayout bij Sun

GridLayout, GridBagLayout en SpringLayout

Bij Sun meer info over GridLayout, GridBagLayout en SpringLayout.

Meer tutorials:
leer ook: html | xhtml | css | asp | asp.net | c# | ado.net | linq | ajax | java | javascript
Valid HTML 4.01! Valid CSS! © - Cursusweb