Universität Augsburg, Institut für Informatik Sommersemester 2006 Prof. Dr. Werner Kießling 27. Juli 2006 M. Endres, A. Huhn, T. Preisinger Lösungsblatt 12 Aufgabe 1: Image Viewer ImageViewer.java Informatik II import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import javax.swing.filechooser.filefilter; import javax.imageio.*; import java.awt.image.*; import java.awt.geom.*; //Klasse ShowImage class ShowImage extends JComponent { // Position im BufferedImage-Array private int pos; // hier werden die Bilder gespeichert private File[] files; // BufferedImage zum lesen // eines Bildes private BufferedImage bf; // Hoehe und Breite des Bildes private int height, width; // Konstruktor public ShowImage() { pos = -1; height = 0; width = 0; // Ablegen der Bilder in files public void setimages(file[] files) { this.files = files; public void nextimage() throws IOException { // pos ums 1 erhoehen und wieder // von vorne beginnen, wenn man am // Ende der Bilderserie angelangt ist pos = ++pos % files.length; // lesen des Bildes bf = ImageIO.read(files[pos]); // Hoehe und Breite ermitteln setimagesize(); // neu zeichnen repaint();
// setzen der Bildgroesze // nur moeglich, wenn das Bild schon // vollstaendig geladen wurde. // Deshalb wird ein BufferedImage // verwendet private void setimagesize() { width = bf.getwidth(); height = bf.getheight(); public int getimageheight() {return height; public int getimagewidth() {return width; // zurueckgeben des aktuellen Bildes // z.b. zum Speichern public BufferedImage getimage() {return bf; // Hoehe und Breite in einen String schreiben public String tostring() { return "File: " + files[pos].getabsolutepath() + "; Height: " + height + "; Width: " + width; // rotieren des Bildes um theta, // nicht des Graphics-Objektes public void rotate() { // Affine Transformation // Drehung um 90 Grad nach rechts AffineTransform tx = new AffineTransform(0,-1,1,0,0,bf.getWidth()); AffineTransformOp op = new AffineTransformOp( tx, AffineTransformOp.TYPE_BILINEAR); // transformiert bf und speichert das Ergebnis wieder in bf // zweiter Parameter ist null, // da uns die Ergebnisse der Transformation nicht interessieren bf = op.filter(bf, null); // Bildgroesze neu setzen setimagesize(); repaint(); // zeichnen des Bildes protected void paintcomponent(graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawimage(bf, 0, 0, this); // Die eigentliche Klasse ImageViewer public class ImageViewer extends JFrame implements MouseListener, KeyListener { private ShowImage si = new ShowImage(); // Dateiauswahldialog JFileChooser jfc = new JFileChooser(); // Konstruktor public ImageViewer() {
super("image Viewer"); setlayout(new BorderLayout()); // zum gleichzeitigen Selektieren mehrerer Dateien jfc.setmultiselectionenabled(true); // Nur Dateien, keine Verzeichnisse jfc.setfileselectionmode(jfilechooser.files_only); // FileFilter setzen // nur gifs, jpgs und pngs jfc.setfilefilter(new FileFilter() { // hierzu muss man die beiden Methoden accept // und getdescription ueberschreiben public boolean accept(file file) { return file.isdirectory() file.getname().tolowercase().endswith(".jpg") file.getname().tolowercase().endswith(".gif") file.getname().tolowercase().endswith(".png"); ); public String getdescription() { return "*.jpg;*.gif;*.png"; add(si, BorderLayout.CENTER); addmouselistener(this); addkeylistener(this); setdefaultcloseoperation(jframe.exit_on_close); setsize(600, 400); setvisible(true); // laden der Bilder private void loadimages() { jfc.showopendialog(null); File[] files = jfc.getselectedfiles(); try { si.setimages(files); // erstes Bild anzeigen si.nextimage(); // anpassen der Fenstergroesze setframesize(); // setzen der Titelleiste setimagetitle(); catch (IOException e) { // Fehler abfangen nextimageerror(e.getlocalizedmessage()); // speichern der Bilder private void saveimage() { if (jfc.showsavedialog(null) == JFileChooser.APPROVE_OPTION) { try { // schreiben des BufferedImage ImageIO.write(si.getImage(), "png", jfc.getselectedfile());
catch (IOException ioe) { // Fehler abfangen JOptionPane.showMessageDialog(null, "Save Error " + ioe.getlocalizedmessage(), "Error", JOptionPane.ERROR_MESSAGE); // wird aufgerufen, falls ein Fehler // beim Anzeigen eines Bildes auftritt private void nextimageerror(string error) { JOptionPane.showMessageDialog(null, "Next Image Error " + error, "Error", JOptionPane.ERROR_MESSAGE); // setzen der Titelleiste private void setimagetitle() { this.settitle("image Viewer - " + si.tostring()); // anpassen der Fenstergroesze private void setframesize() { // der Rahmen des Fensters muss beruecksichtigt werden // damit die Fenstergroesze richtig angepasst wird int left = getinsets().left; // 3 int top = getinsets().top; // 29 int right = getinsets().right; // 3 int bottom = getinsets().bottom; // 3 this.setsize(si.getimagewidth() + left + right, si.getimageheight() + top + bottom); // Methoden von MouseListener public void mouseclicked(mouseevent e) { // linke Maustaste if (e.getmodifiers() == MouseEvent.BUTTON1_MASK) { try { si.nextimage(); setframesize(); setimagetitle(); catch (IOException ioe) { nextimageerror(ioe.getlocalizedmessage()); ; // mittlere Maustaste if (e.getmodifiers() == MouseEvent.BUTTON2_MASK) { loadimages();
// Emulation der mittleren Maustaste // durch druecken beider Tasten bei einer // 2-Tasten-Maus public void mousepressed(mouseevent e) { if ((e.getmodifiersex() & (MouseEvent.BUTTON1_DOWN_MASK MouseEvent.BUTTON3_DOWN_MASK)) == (MouseEvent.BUTTON1_DOWN_MASK MouseEvent.BUTTON3_DOWN_MASK)) { loadimages(); ; public void mousereleased(mouseevent e) {; public void mouseentered(mouseevent e) {; public void mouseexited(mouseevent e) {; public void keyreleased(keyevent e) {; public void keypressed(keyevent e) {; // Tastaturereignisse public void keytyped(keyevent e) { // rotieren if (e.getkeychar() == r ) { si.rotate(); setframesize(); setimagetitle(); // speichern if (e.getkeychar() == s ) { saveimage(); ; // beenden if (e.getkeychar() == q ) { System.exit(0); // main-methode public static void main(string[] args) { new ImageViewer();
// paintcomponent public void paintcomponent(graphics g) { switch (number) { case 0: draw5(g); case 1: case 2: draw5(g); case 3: case 4: Aufgabe 2: Applet - Digitale Anzeige Segment.java import java.awt.*; import javax.swing.*; // Klasse Segment class Segment extends JComponent { // anzuzeigende Ziffer private int number; // Koordinaten fuer die Segmente private int[] x147 = { 20, 30, 60, 70, 60, 30, 20 ; private int[] x25 = { 5, 15, 25, 25, 15, 5, 5 ; private int[] x36 = { 65, 75, 85, 85, 75, 65, 65 ; private int[] y23 = { 30, 20, 30, 60, 70, 60, 30 ; private int[] y56 = { 90, 80, 90, 120, 130, 120, 90 ; // Konstruktor Segment() {setsize(90, 150); // setzen der Ziffer public void set(int n) { number = n; repaint();
case 5: case 6: draw5(g); case 7: case 8: draw5(g); case 9: default: // Methoden zum Fuellen der Segmente private void draw1(graphics g) { int[] y = { 15, 5, 5, 15, 25, 25, 15 ; g.fillpolygon(x147, y, 7); private void draw2(graphics g) { g.fillpolygon(x25, y23, 7); private void draw3(graphics g) { g.fillpolygon(x36, y23, 7);
private void draw4(graphics g) { int[] y = { 75, 65, 65, 75, 85, 85, 75 ; g.fillpolygon(x147, y, 7); private void draw5(graphics g) { g.fillpolygon(x25, y56, 7); private void draw6(graphics g) { g.fillpolygon(x36, y56, 7); private void draw7(graphics g) { int[] y = { 135, 125, 125, 135, 145, 145, 135 ; g.fillpolygon(x147, y, 7); Counter.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Counter extends JPanel implements MouseListener { // Segmente fuer den Hunderter, Zehner und Einer private Segment hunderter, zehner, einer; private int counter; // Konstruktor public Counter() { setsize(160, 280); setlayout(null); hunderter = new Segment(); zehner = new Segment(); einer = new Segment(); // setzen der Positionen // einfach mit setlocation hunderter.setlocation(0, 0); zehner.setlocation(90, 0); einer.setlocation(180, 0); // hinzufuegen der Segmente add(hunderter); add(zehner); add(einer); // MouseListener einer.addmouselistener(this); zehner.addmouselistener(this); hunderter.addmouselistener(this); // Konstruktor mit Zahl public Counter(int n) {
setcounter(n); public void mouseclicked(mouseevent e) { inccounter(); public void mousereleased(mouseevent e) { public void mousepressed(mouseevent e) { public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { // setzen des Zaehlers public void setcounter(int i) { counter = i; einer.set(i % 10); zehner.set((i / 10) % 10); hunderter.set((i / 100) % 10); repaint(); public int getcounter() { return counter; // um eins hochzaehlen public void inccounter() { setcounter((getcounter() + 1) % 1000); CounterApplet.java import javax.swing.*; // CounterApplet Klasse public class CounterApplet extends JApplet { Counter c; // initialisieren des Applets public void init() { // Counter auf 0 setzen c = new Counter(0); add(c); validate();