Dit hoofdstuk leert je hoe je lijnen, vormen en kleuren kan gebruiken binnen een toepassing.
extend JPanel
Het tekenen kan je doen op een JPanel, hiervoor gebruik je de methode paintComponent van het JPanel.
Concreet zullen we een klasse maken die overerft van JPanel, we overriden de methode paintComponent en geven deze onze eigen opvulling.
repaint
We gebruiken de methode repaint om veranderingen in de tekening weer te geven.
Kleuren
Binnen de constructor van onze eigen klasse kunnen we de achtergrondkleur van het tekenpaneel instellen.
In Java bestaan een aantal standaardkleuren waar je enkel de naam voor hoeft te kennen: deze namen werden in vorige versies van Java genoteerd met kleinen letters, men is vanaf versie 1.4 overgestapt op hoofdletters.
Oud: Color.black, Color.darkGray, Color.gray, Color.lightGray, Color.white, Color.magenta, Color.red, Color.pink, Color.orange, Color.yellow, Color.green, Color.cyan, Color.blue
Vanaf 1.4: Color.BLACK, Color.DARK_GRAY, Color.GRAY, Color.LIGHT_GRAY, Color.WHITE, Color.MAGENTA, Color.RED, Color.PINK, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.CYAN, Color.BLUE
Je kan ook zelf kleuren samenstellen door aan te geven wat het aandeel rood, groen en blauw is in de kleur (int 0 - 255).
Color c = new Color(255, 255, 240);
this.setBackground(c);
Fonts
Werken met lettertypes kan met behulp van de klasse
Font.
Font f;
f = new Font(String naam, int stijl, int grootte);
Waarbij de naam "serif", "sansserif", "monospaced" of een font aanwezig op het systeem is.
Stijl is een integer, waarbij je de Java-constanten Font.PLAIN. Font.BOLD, Font.ITALIC of Font.BOLD+Font.ITALIC kan gebruiken.
Grootte is een integer die de puntgrootte aangeeft, typisch een waarde in het bereik 8 - 48.
Wens je een lijst met de beschikbare lettertypes op het systeem, dan kan je dit als volgt opvragen:
String typen[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
for(int i=0 ; i < typen.length; i++){
System.out.println(typen[i]);
}
Methoden van het Graphics-object
Wanneer je de methode paintComponent van een JPanel overridet dan ontvang je een object van de klasse Graphics, meestal wordt aan dit object de naam g gegeven.
Dit object kan je gebruiken om te tekenen op het JPanel of hiervoor je eigen klasse gebruiken die overerft van JPanel.
Belangrijke methoden voor het Graphics-object, met de meest gebruikte argumenten:
| methode |
omschrijving |
| drawLine(x1, y1, x2, y2) |
Teken een lijn |
| drawRect(x, y, width, height) |
Teken een rechthoek. x,y is de linkerbovenhoek |
| fillRect(x, y, width, height) |
Een gevulde rechthoek |
| drawOval(x, y, width, height) |
Ovaal |
| fillOval(x, y, width, height) |
Gevulde ovaal |
| drawArc( x, y, width, height, startAngle, arcAngle) |
Een cirkelboog. Het centrum van de boog is het centrum van de rechthoek met linkerbovenhoek op positie x,y en opgegeven breedte en hoogte. De hoek die overspannen wordt geef je op in graden met een starthoek en eindhoek. O als hoekwaarde is de hoek op 3uur. Een positieve waarde zorgt voor een hoekwaarde in tegenwijzerzin. |
| fillArc( x, y, width, height, startAngle, arcAngle) |
Een gevulde cirkelboog |
| setFont(Font f) |
Stel het lettertype in |
| drawString(String s, x, y) |
Toon een tekenreeks. |
| drawPolyline(int[] xPoints, int[] yPoints, nPoints) |
Teken een lijn die de aangegeven punten verbindt.De eindpunten worden niet automatisch gesloten. Je kan geeft ook het aantal te tekenen punten op. |
| drawPolygon( int[] xPoints, int[] yPoints, nPoints) |
Teken een lijn die de aangegeven punten verbindt en sluit de eindpunten. |
| fillPolygon( int[] xPoints, int[] yPoints, nPoints) |
Opgevulden Polygon. |
| drawPolygon(poly) |
Hier geef je een Polygon-object mee aan de methode drawPolygon. Op die manier kan je de polygoon eerste samenstellen vanuit code:
Polygon poly = new Polygon();
//punt toevoegen aan de Polygoon
poly.addPoint(x, y);
. . .
g.drawPolygon(poly);
Dit kan je ook gebruiken bij fillPolygon.
|
Methoden van het JPanel
Aansluitend bij bovenstaande tabel kan je een aantal methoden toepassen op het JPanel (of een subklasse hiervan).
| methode |
beschrijving |
| setPreferredSize(new Dimension(width, height)) |
Stel de dimensies in van het Canvas |
| setBackground(Color c); |
Stel de achtergrondkleur in. |
| setForeground(Color c); |
Stel de voorgrondkleur in (kleur van de pen). |
| getVisibleRect() |
Levert een Rectangle-object met een width en height-eigenschap om de breedte en hoogte van het tekenoppervlak te kennen |
| getWidth() |
Breedte van het tekengebied |
| getHeight() |
Hoogte van het tekengebied |
Werkwijze
Om een toepassing te maken met NetBeans IDE waarbij we een subklasse gebruiken van JPanel gaan we als volgt te werk:
- We starten een nieuw project via de Project Manager
- We mounten de applicatiemap: rechtsklik Filesystems en kies mount > local directory
- Rechtsklik de gemounte map en kies new > JFrame Form
Geef als naam FiguurKeuze en druk finish.
- Rechtsklik de gemounte map en kies new > JPanel Form
Geef als naam tekenPaneel en druk finish.
- Override in de code van tekenPaneel de methode paintComponent:
protected void paintComponent(java.awt.Graphics g) {
super.paintComponent(g);
...uw tekenopdrachten...
}
- Compileer tekenPaneel
- Rechtsklik tekenPaneel kies copy, paste in FiguurKeuze > Form FiguurKeuze > JFrame
- Rechtsklik tekenePaneel1 > Properties
Stel een PreferredSize in vb. 400, 300
- Vul de nodige tekenopdrachten aan in paintComponent van tekenPaneel
- Build en voer FiguurKeuze uit
Voorbeeld
Een voorbeeldtoepassing die het tekenen in een subklasse tekenPaneel van JPanel illustreert. In de toepassing wordt gewerkt met een instantievariabele figuur in de klasse tekenPaneel. Deze variabele is in te stellen via de methode setFiguur. In de methode paintComponent roepen we eerst de methode paintComponent van de superklasse JPanel aan met volgende opdracht:
Hierna wordt in de methode
paintComponent gekeken wat de waarde van deze variabele
figuur is, en de juiste tekenopdracht wordt uitgevoerd.
In het hoofdprogramma FiguurKeuze kan de gebruiker met behulp van een JMenuBar een figuur kiezen. Hierbij wordt de variabele figuur ingesteld en de methode repaint van tekenPaneel1 uitgevoerd, waardoor de methode paintCompontent van tekenPaneel1 opnieuw wordt uitgevoerd.
TIP: roep nooit zelf de methode paintComponent opnieuw op, maar werk met de methode repaint van het tekenPaneel-object.

Toon /verberg
import java.awt.*;
public class tekenPaneel extends javax.swing.JPanel {
private String figuur = "rechthoek";
public tekenPaneel() {
setBackground(Color.YELLOW);
initComponents();
}
private void initComponents() {
setLayout(new java.awt.BorderLayout());
}
protected void paintComponent(java.awt.Graphics g) {
super.paintComponent(g);
java.awt.Rectangle r = this.getVisibleRect();
//Naam van de figuur op het scherm
Font big = new Font("Bookman Old Style", Font.BOLD, 16);
g.setFont(big);
g.setColor(Color.BLACK);
g.drawString(figuur,20,50);
//Tekenen van de juiste figuur
if (figuur == "rechthoek"){
g.setColor(Color.BLUE);
g.fillRect(r.x + r.width / 4, r.y + r.height / 4,r.width / 2, r.height / 2);
}
if (figuur == "lijn"){
g.setColor(new Color(0,255,0));
g.drawLine(r.x + r.width, r.y ,r.x , r.y + r.height);
}
if (figuur == "ovaal"){
g.setColor(new Color(255,0,0));
g.fillOval(r.x + r.width / 4, r.y + r.height / 4,r.width / 2, r.height / 2);
}
if (figuur == "boog"){
g.setColor(new Color(255,0,0));
g.fillArc(r.x + r.width / 4, r.y + r.height / 4,r.width / 2, r.height / 2,0, 90);
g.setColor(Color.BLACK);
g.drawRect(r.x + r.width / 4, r.y + r.height / 4,r.width / 2, r.height / 2);
}
if (figuur == "polyline"){
int xen[] = { 50,70,90,110,130,150 };
int yen[] = { 150,200,140,210,90,130 };
g.setColor(new Color(255,0,0));
g.drawPolyline(xen,yen,xen.length);
}
if (figuur == "polygon"){
int xen[] = { 50,70,90,110,130,150 };
int yen[] = { 150,200,140,210,90,130 };
g.setColor(Color.LIGHT_GRAY);
g.fillPolygon(xen,yen,xen.length);
}
}
public java.lang.String getFiguur() {
return figuur;
}
public void setFiguur(java.lang.String figuur) {
this.figuur = figuur;
}
// Variables declaration - do not modify
// End of variables declaration
}
public class FiguurKeuze extends javax.swing.JFrame {
public FiguurKeuze() {
initComponents();
tekenPaneel1.setFiguur("lijn");
tekenPaneel1.repaint();
}
private void initComponents() {
tekenPaneel1 = new tekenPaneel();
jToolBar1 = new javax.swing.JToolBar();
cmdLijn = new javax.swing.JButton();
cmdRechthoek = new javax.swing.JButton();
cmdOvaal = new javax.swing.JButton();
cmdBoog = new javax.swing.JButton();
cmdPolyline = new javax.swing.JButton();
cmdPlygon = new javax.swing.JButton();
setTitle("Werken met Graphics");
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
tekenPaneel1.setPreferredSize(new java.awt.Dimension(400, 300));
cmdLijn.setText("Lijn");
cmdLijn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cmdLijnActionPerformed(evt);
}
});
jToolBar1.add(cmdLijn);
cmdRechthoek.setText("Rechthoek");
cmdRechthoek.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cmdRechthoekActionPerformed(evt);
}
});
jToolBar1.add(cmdRechthoek);
cmdOvaal.setText("Ovaal");
cmdOvaal.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cmdOvaalActionPerformed(evt);
}
});
jToolBar1.add(cmdOvaal);
cmdBoog.setText("Boog");
cmdBoog.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cmdBoogActionPerformed(evt);
}
});
jToolBar1.add(cmdBoog);
cmdPolyline.setText("Polyline");
cmdPolyline.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cmdPolylineActionPerformed(evt);
}
});
jToolBar1.add(cmdPolyline);
cmdPlygon.setText("Polygon");
cmdPlygon.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cmdPlygonActionPerformed(evt);
}
});
jToolBar1.add(cmdPlygon);
tekenPaneel1.add(jToolBar1, java.awt.BorderLayout.NORTH);
getContentPane().add(tekenPaneel1, java.awt.BorderLayout.NORTH);
pack();
}
private void cmdPolygonActionPerformed(java.awt.event.ActionEvent evt) {
tekenPaneel1.setFiguur("polygon");
tekenPaneel1.repaint();
}
private void cmdPolylineActionPerformed(java.awt.event.ActionEvent evt) {
tekenPaneel1.setFiguur("polyline");
tekenPaneel1.repaint();
}
private void cmdBoogActionPerformed(java.awt.event.ActionEvent evt) {
tekenPaneel1.setFiguur("boog");
tekenPaneel1.repaint();
}
private void cmdOvaalActionPerformed(java.awt.event.ActionEvent evt) {
tekenPaneel1.setFiguur("ovaal");
tekenPaneel1.repaint();
}
private void cmdRechthoekActionPerformed(java.awt.event.ActionEvent evt) {
tekenPaneel1.setFiguur("rechthoek");
tekenPaneel1.repaint();
}
private void cmdLijnActionPerformed(java.awt.event.ActionEvent evt) {
tekenPaneel1.setFiguur("lijn");
tekenPaneel1.repaint();
}
private void exitForm(java.awt.event.WindowEvent evt) {
System.exit(0);
}
public static void main(String args[]) {
new FiguurKeuze().show();
}
// Variables declaration - do not modify
private javax.swing.JButton cmdBoog;
private javax.swing.JButton cmdLijn;
private javax.swing.JButton cmdOvaal;
private javax.swing.JButton cmdPolygon;
private javax.swing.JButton cmdPolyline;
private javax.swing.JButton cmdRechthoek;
private javax.swing.JToolBar jToolBar1;
private tekenPaneel tekenPaneel1;
// End of variables declaration
}