JButton |
JCheckBox |
JRadioButton |
JTextField |
JComboBox
JList |
JSlider |
JSpinner |
JTextArea |
JProgressBar |
JTable
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:
| 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, ... |
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... | |
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.
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.
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.
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.
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;
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.
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);
}
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){...}
...
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).
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) |
|
||||||||||||||||
| JFrame | Een applicatie-venster |
|
||||||||||||||||
| JOptionPane | Een standaarddialoogvenster |
|
||||||||||||||||
| JDialog | Een aangepast dialoogvenster |
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) |
|
||||||
| 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 |
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 |
De volgende componenten vormen de basiscomponenten voor interactiviteit met de gebruiker.
| Component | Beschrijving | Belangrijkste methoden | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Een opdrachtknop, kan tekst en / of een icoon bevatten |
|
|||||||||||||||||||||||||||||||||||||
| JCheckBox | Een aankruisvakje met tekst erbij |
|
||||||||||||||||||||||||||||||||||||
| Een selectierondje met tekst erbij |
|
|||||||||||||||||||||||||||||||||||||
| ButtonGroup | Een groep van selectierondjes (zodanig dat er slechts 1 element geselecteerd kan zijn). |
|
||||||||||||||||||||||||||||||||||||
| Meer over buttons, checkboxen en radiobuttons bij Sun | ||||||||||||||||||||||||||||||||||||||
| JTextField | Een tekstvak, erf over van JTextComponent |
|
||||||||||||||||||||||||||||||||||||
| Meer over JTextField maar ook JFormattedTextField en JPasswordField bij Sun | ||||||||||||||||||||||||||||||||||||||
| JComboBox | Een keuzelijst met / zonder (standaard) 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. |
|
||||||||||||||||||||||||||||||||||||
| Meer over JList bij Sun | ||||||||||||||||||||||||||||||||||||||
| JSlider | Een JSlider stelt de gebruiker in staat via een schuifregelaar waarden te zien of in te stellen. |
|
||||||||||||||||||||||||||||||||||||
| 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. |
|
||||||||||||||||||||||||||||||||||||
| Meer over JSpinner bij Sun | ||||||||||||||||||||||||||||||||||||||
| JTextArea | Tekstgebied voor meer dan één regel tekst, al dan niet editeerbaar. Erft over van JTextComponent. |
|
||||||||||||||||||||||||||||||||||||
|
Meer over JTextArea bij Sun Bekijk ook de mogelijkheden van JEditorPane en JTextPane |
||||||||||||||||||||||||||||||||||||||
| JProgressBar | Voortgangsbalk |
|
||||||||||||||||||||||||||||||||||||
|
Meer over JProgressBar bij Sun |
||||||||||||||||||||||||||||||||||||||
| JTable | Tabel |
|
||||||||||||||||||||||||||||||||||||
|
Meer over JTable bij Sun |
||||||||||||||||||||||||||||||||||||||
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
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. :
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.
![]() |
![]() |
Toon /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
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.
Meer over BorderLayout bij Sun
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).
![]() |
![]() |
Met een JTabbePane kan je een vergelijkbare opmaak maken zonder gebruik te maken van een CardLayout.
Meer over CardLayout bij Sun
| Meer tutorials: |
| leer ook: | html | | xhtml | | css | | asp | | asp.net | | c# | | ado.net | | linq | | ajax | | java | | javascript |