GI-Kap 4 grafik

Werbung
Graphische Nutzerschnittstellen
Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm
Hochschule Harz
FB Automatisierung und Informatik
[email protected]
Raum 2.202
Tel. 03943 / 659 338
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
1
Inhalt
1. Einführung, Literatur, Begriffe
2. Architektur eines Fenstersystems
3. Java-Dialog (Dialog/SDI/MDI)
4. Grafik in Java
5. Benutzeroberfläche (Layout, Dialog, RDI, GUI-Elemente)
6. Design Pattern (Framework, Mehrschicht Anwendung)
7. Testroutinen (JUnit)
8. JDBC (Datenbankanbindung)
9. Threads
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
1
Benutzeroberflächen: Zeichnen in Java
Benötigte Elemente:
• Linien (Farbe, Strichdicke, Strichart)
• Zeichenblatt (JFrame, JPanel, Canvas)
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
3
Benutzeroberflächen: Zeichnen in Java
Methode
Beschreibung
clearRect()
Löscht ein Gebiet der Zeichenfläche
copyArea()
kopiert ein Rechteck innerhalb der Zeichenfläche
drawArc()
zeichnet einen Bogen
drawLine()
zeichnet eine Gerade
drawOval()
zeichnet eine Ellipse
drawPolygon() zeichnet ein Polygon (Array)
drawRect()
zeichnet ein Rechteck
drawRoundRect() zeichnet ein Rechteck mit abgerundeten Ecken
fillArc()
füllt einen Bogen mit Farbe
fillOval()
füllt ein Oval mit Farbe
fillPolygon()
füllt ein Polygon mit Farbe
fillRect()
füllt ein Rechteck mit Farbe
getColor()
gibt die aktuelle Zeichnungsfarbe aus
getFont()
gibt den aktuellen Zeichensatz aus
getFontMetrics() gibt die aktuellen Parameter des Zeichensatzes aus
setColor()
legt die Zeichnungsfarbe fest
setFont()
setzt den aktuellen Zeichensatz
drawString(…) HexEditor
drawChars()
Array von Char´s
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
4
2
Zeichnen in Java: Linien
Linien zeichnen
public void paint (Graphics g)
{
int x = 80;
for (int i=0; i<60; i++) {
g.drawLine(x,40,x,100);
x += 1+ 3*Math.random()
}
}
•Die Variable g bezeichnet man auch als Grafikkontext
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Line-rect-circle\Line1
5
Zeichnen in Java: Linien
import java.awt.*;
import javax.swing.JFrame;
public class Linie01 extends JFrame {
public Linie01() {
setDefaultCloseOperation(…);
} // construktor
public void paint (Graphics g)
{
int x = 80;
for (int i=0; i<60; i++) {
g.drawLine(x,40,x,100);
x += 4+ 6*Math.random();
}
} // paint
public static void main(String[] args)
{
Linie01 f ;
f = new Linie01();
f.setSize(500, 300);
f.setTitle("1. Grafikbeispiel");
f.setVisible(true);
} // main
} // class
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Line01
6
3
Zeichnen in Java: Linien
import java.awt.*;
import javax.swing.JFrame;
public class Linie01 extends JFrame {
public Linie01() {
setDefaultCloseOperation(…);
this.getContentPane().add(
new CCanvas(),
BorderLayout.CENTER );
} // construktor
Update:
• canvas.update( canvas.getGraphics() );
public static void main(String[] args)
{
Linie01 f ;
f = new Linie01();
f.setSize(500, 300);
f.setTitle("1. Grafikbeispiel");
f.setVisible(true);
} // main
} // class
class CCanvas extends Canvas {
public void paint (Graphics g)
{
int x = 80;
for (int i=0; i<60; i++) {
g.drawLine(x,40,x,100);
x += 1+ 3*Math.random();
}
} // paint
} // CCanvas
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Line01
7
Zeichnen in Java: Linien
class CCanvas extends Canvas {
private int count=0;
public void paint (Graphics g)
{
count=count+1;
System.out.println(count+". zeichnen");
g.setColor(Color.white);
g.fillRect(0,0, getWidth(), getHeight() );
g.setColor(Color.red);
int width,height;
width = this.getWidth();
height = this.getHeight();
g.drawLine(0,0,width,height);
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Line02
8
4
Zeichnen in Java: Linien
Linien zeichnen
Links /oben :100,100
Rechts / unten:600,400
mitte / oben: 350, 50
Vorlesungsaufgabe
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Line03
9
Vorlesungsaufgabe:
public void paint (Graphics g)
{
g.drawLine(100,100, 600,100);
g.drawLine(600,100, 600,400);
g.drawLine(100,400, 600,400);
g.drawLine(100,100, 100,400);
// waagerecht oben
// senkrecht rechts
// waagerecht unten
// senkrecht links
g.drawLine(100,100, 600,400); // links oben nach rechts unten
g.drawLine(100,400, 600,100); // links unten nach rechts oben
g.drawLine(100,100, 350, 50); // links oben nach rechts unten
g.drawLine(350, 50, 600,100); // links unten nach rechts oben
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Line2
10
5
Sinusfunktionen:
double f(double x) {
return (Math.cos(x/5) + Math.sin(x/7) + 2) * getSize().height / 4;
}
public void paint (Graphics g)
{
for (int x = 0 ; x < getSize().width ; x++) {
g.drawLine(x, f(x), x + 1, f(x + 1));
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Line04
11
class CCanvas extends Canvas {
double f(double x) {
return (Math.cos(x/5) + Math.sin(x/7) + 2) * getSize().height / 4;
}
public void paint (Graphics g) {
g.setColor(Color.white);
g.fillRect(25,25,
getWidth()-50, getHeight()-50 );
g.setColor(Color.red);
for (int x = 0 ; x < getSize().width ; x++) {
g.drawLine(x, (int) f(x), x + 1, (int) f(x + 1));
}
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Line04
12
6
Sinusfunktionen:
double f(double x) {
return ( Math.sin(x/7) + 2) * getSize().height / 4;
}
public void paint (Graphics g)
{
Color c;
Font f;
for (int x = 0 ; x < getSize().width ; x++) {
g.drawLine(x, (int)f(x), x + 1, (int)f(x + 1));
c = g.getColor();
f = g.getFont();
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Line05
13
Gedämpfte Sinusschwingung:
double f(double x) {
return ( Math.sin(x/7)*Math.exp(-x*0.002) + 2) * getSize().height / 4;
}
public void paint (Graphics g)
{
Color c;
Font f;
for (int x = 0 ; x < getSize().width ; x++) {
g.drawLine(x, (int)f(x), x + 1, (int)f(x + 1));
c = g.getColor();
f = g.getFont();
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Line6
14
7
Zeichnen in Java: Rechteck
Aufgabe: Zeichnen von 10 Rechtecken
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Rect1
15
Zeichnen in Java: Rechteck
public void paint (Graphics g)
{
int x, y; // Mittelpunkt
int w, h; // Breite Höhe
for (int i=0; i<10; i++) {
x = (int) ( 400*Math.random() ); // Links Oben
y = (int) ( 200*Math.random() ); // Links Oben
w = (int) ( 400*Math.random() ); // Width
h = (int) ( 200*Math.random() ); // Height
g.drawRect(x,y,w,h);
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Rect1
16
8
Zeichnen in Java: Rechteck
Recchteck Koordinaten
x0 = 200;
y0 = 200;
diffx = 50;
diffy = 25;
diff wird nach jedem Zeichen um
10 Punkte erhöht
Vorlesungsaufgabe
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Rect2
17
Zeichnen in Java: Rechtecke zeichnen
diff
diff
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Rect2
18
9
Vorlesungsaufgabe:
int x0, y0; // Mittelpunkt
int x, y;
// Mittelpunkt links / oben
int w, h; // Breite Höhe
int diff;
x0 = 200;
y0 = 200;
diff = 50;
g.setColor(Color.red);
g.drawLine(x0-200,y0,x0+200,y0);
g.drawLine(x0,y0-200,x0,y0+200);
g.setColor(Color.blue);
for (int i=0; i<10; i++) {
x = x0 - diff;
y = y0 - (diff >> 1);
h = diff;
w = diff << 1;
g.drawRect(x,y,w,h);
diff += 10;
} // for
// SHR
// SHL
Rect2
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
19
Zeichnen in Java: Kreis
public void paint (Graphics g)
{
int x, y; // Mittelpunkt
int w, h; // Breite Höhe
x = 80;
y = 80;
for (int i=0; i<10; i++) {
w = (int) ( 400*Math.random() );
h = w;
g.drawOval(x,y,w,h);
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Circle1
20
10
Zeichnen in Java: Kreis
public void paint (Graphics g)
{
int x0, y0; // Mittelpunkt
int d; // Durchmesser
int r; // Radius
x0 = 300;
y0 = 300;
for (int i=0; i<10; i++) {
// Verschieben
d = (int) ( 400*Math.random() );
r = d >> 1;
g.drawOval(x0-r,y0-r,d,d);
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Circle2
21
Zeichnen in Java: Kreis
public void paint (Graphics g)
{
int x, y; // Mittelpunkt
int d; // Durchmesser
int r; // Radius
x = 300;
y = 300;
for (int i=0; i<10; i++) {
// Verschieben
d = (int) ( 400*Math.random() );
r = d >> 1;
g.drawOval(x-r,y-r,d,d);
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Circle2
22
11
Zeichnen mit eine eigenen Klasse
• Ableiten von Canvas oder JPanel
• Implementieren der paint-Methode
− public void paint (Graphics g) {
−
this.paintComponents(g);
−
g.setColor(Color.white);
−
g.fillRect(0,0, this.getWidth(), this.getHeight());
−
−
g.setColor( Color.blue );
g.drawLine(10,10, getWidth()-10,getHeight()-10) ;
− } // paint
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
23
Methode drawString
• drawString(String s, int x, int y);
• Abmessungen Klasse FontMetrics:
− public void paint (Graphics g) {
−
this.paintComponents(g);
−
…
− }
• Beispiel:
− Font f1 = new Font("Courier New", Font.PLAIN, size);
− FontMetrics fontMetrics = g.getFontMetrics(f1);
− int rowHeight = fontMetrics.getHeight();
− int margin = fontMetrics.stringWidth("XXXX");
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
24
12
Klasse Font
Font[] ff = java.awt.GraphicsEnvironment.getAllFonts();
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
25
Font myFont=new Font("Arial", Font.ITALIC | Font.PLAIN, 18);
String s="ABCghi";
// holen der Daten für den Font und des Strings
LineMetrics lm = myFont.getLineMetrics( s,
new FontRenderContext(
new AffineTransform(),
true, //antialiased
true //use fractional metrics?
)
);
// Abmessungen für ausgeben:
System.out.println("String: "+s);
System.out.println("Schriftart: "+myFont.getFontName());
System.out.println("Schriftgröße: "+myFont.getSize());
System.out.println("-------------");
System.out.println("Ascent: "+lm.getAscent());
System.out.println("+Descent: "+lm.getDescent());
System.out.println("+Leading: "+lm.getLeading());
System.out.println("=Height: "+lm.getHeight());
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
26
13
AttributedCharacterIterator (String02)
Aliasing an:
• Graphics2D g2d=(Graphics2D)g;
• g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON );
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
27
AttributedCharacterIterator (String03)
• Ausgabe mit Attributen
addAttribute(
AttributedCharacterIterator.Attribute attribute,
Object value,
// z. B. 1)
int beginIndex,
int endIndex
)
1)
GradientPaint
TextAttribute.UNDERLINE_LOW_DASHED
TextAttribute.SWAP_COLORS_ON
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
28
14
AttributedCharacterIterator (String03)
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
29
Font f1 = new Font("Arial", Font.PLAIN, 36);
Font f2 = new Font("Times New Roman", Font.PLAIN, 60);
AttributedString as = new AttributedString("Informatik ist toll, aber
auch Mathematik oder Sport");
as.addAttribute( TextAttribute.FONT, f1 );
as.addAttribute( TextAttribute.FOREGROUND, new GradientPaint(
0,0,
Color.red,
0,10,
Color.white ,true ), 15,19);
( as.getIterator(), 30,100 );
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
30
15
as.addAttribute( TextAttribute.FONT, f2, 0, 4 );
as.addAttribute( TextAttribute.FOREGROUND,
new GradientPaint(
0,0,
Color.blue,
10,0,
Color.green ,true ), 26,31); // "auch" setzen
as.addAttribute( TextAttribute.FONT, f2, 26, 31 );
as.addAttribute( TextAttribute.UNDERLINE,
TextAttribute.UNDERLINE_LOW_DASHED, 31,41 );
as.addAttribute( TextAttribute.SWAP_COLORS,
TextAttribute.SWAP_COLORS_ON, 22,27 );
g2d.drawString( as.getIterator(), 30,100 );
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
31
Dialog_2D: Strichstärken und Strichmuster
public void paint (Graphics g) {
int x = 80;
Rectangle r = new Rectangle();
g.getClipBounds(r);
Graphics2D g2 = (Graphics2D) g;
float [] dashs = {40.0f, 5.0f}; // Länge Strich , Pause
// BasicStroke(float width, int cap, int join, float miterlimit,
//
float[] dash, float dash_phase) // 1.0f = miterlimit
g.setColor(Color.WHITE);
g.fillRect(0,0, getWidth(), getHeight() );
g2.setStroke( new BasicStroke(LineWidth, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER, 1.0f, dashs, 0.0f ) );
g.setColor(Color.RED);
for (int i=10; i< r.getWidth()-10; i++) {
x = (int) (6.0*Math.random());
if (x==2) g.drawLine(i,20,i,(int) r.getHeight()-10 );
} // for
} // paint
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
32
16
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
33
Beispiele in Grafik2D: nikolaus1, nikolaus2, nikolaus3
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
34
17
Dialog_Area_2D
Dialog_Line_2D
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
35
Dialog_Picture2_2D
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
36
18
Dialog_Transform1_2D: Transformation, Skalierung und Scherung
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
37
MemoryMonitor
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
38
19
Herunterladen