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