Sie sind auf Seite 1von 5

// awt Packages werden implementiert import java.awt.*; import java.awt.event.

*; //Klassenname und Vererbungen werden implementiert public class Malprogramm extends Frame implements Runnable, MouseMotionListener, ActionListener, WindowListener { // Die main-Methode ruft den Konstruktur Malprogramm() auf, setzt Fenstertitel, Gre und macht es sichtbar. public static void main (String args[]) { Malprogramm m = new Malprogramm(); //Anhand des Konstruktors wird ein Objekt der Klassenmethode erstellt m.start(); // Objekt starten m.setTitle ("Malprogramm"); // Fenstertitel m.setSize (600, 600); //Fenstergre m.show(); // anzeigen } // Konstruktor public Malprogramm () { // GUI wird erstellt fensterleiste = new MenuBar(); // Schaltflchenleiste anzeigen datei = new Menu ("Datei"); // Tab "Datei" neu = new MenuItem ("Neu"); // "Datei" -> "Neu" anzeigen schlieen = new MenuItem ("Schlieen"); // Datei -> "Fenster schlieen" anzeigen farben = new Menu ("Farbe & Radieren"); // Tab "Farbe & Radieren" anziegen radiergummi = new MenuItem ("Radiergummi"); // "Farbe & Radieren" -> "Radiergummi" rot = new MenuItem ("Rot"); // "Farbe & Radieren" -> "Rot" gruen = new MenuItem ("Grn"); // "Farbe & Radieren" -> "Grn" blau = new MenuItem ("Blau"); // "Farbe & Radieren" -> "Blau" cyan = new MenuItem ("Cyan"); // "Farbe & Radieren" -> "Cyan" magenta = new MenuItem ("Magenta"); // "Farbe & Radieren" -> "Magenta" schwarz = new MenuItem ("Schwarz"); // "Farbe & Radieren" -> "Schwarz" gelb = new MenuItem ("Gelb"); // "Farbe & Radieren" -> "Gelb" //Schaltflchen werden dem GUI hinzugefgt this.setMenuBar (fensterleiste); fensterleiste.add (datei); datei.add (neu); datei.add (schlieen); fensterleiste.add (farben); farben.add (rot); farben.add (gruen); farben.add (blau); farben.add (gelb); farben.add (cyan); farben.add (magenta); farben.add (schwarz); farben.add (radiergummi); // Events erstellen, die beim Mausklick auf eine Schaltflche aktiviert werden this.addMouseMotionListener (this); neu.addActionListener (this); schlieen.addActionListener (this);

rot.addActionListener (this); gruen.addActionListener (this); blau.addActionListener (this); gelb.addActionListener (this); cyan.addActionListener (this); magenta.addActionListener (this); radiergummi.addActionListener (this); schwarz.addActionListener (this); this.addWindowListener (this); // Basisvariablen werden vor Programmstart "nullgesetzt" xidneu = 0; yidneu = 0; xidalt = 0; yidalt = 0; ammalen = false; farbe = Color.BLACK; } // GUI-Variablen private MenuBar fensterleiste; private Menu datei; private MenuItem neu; private MenuItem schlieen; private private private private private private private private private private Menu farben; MenuItem rot; MenuItem gruen; MenuItem blau; MenuItem gelb; MenuItem cyan; MenuItem magenta; MenuItem radiergummi; MenuItem schwarz; MenuItem wei;

private Thread malen; // Thread, der das Malen steuert private Image buffer; // Buffer, der sich um die Speicherung des Gemalten kmmert private Graphics bg; // Grafik des Buffers // Zustandsvariablen private int xidneu, yidneu; // Beim Malen die neuen Koordinaten - "Linienende" private int xidalt, yidalt; // Beim Malen die alten Koordinaten "Linienbeginn" private boolean ammalen; // Maustaste gedrckt? private Color farbe; // Momentan ausgewhlte Farbe // Ab hier folgen alle Methoden // Parallelablaufender malen-Thread wird erstellt und gestartet public void start() { malen = new Thread (this);

malen.start();

// in run() wird der malen-Thread um 1ms mit einer try-catch-Anweisung verzgert und neugezeichnet public void run() { while (true) { try { malen.sleep (1); // Verzgerung des Eingabegertes von 1ms } catch (InterruptedException e) {} repaint(); } } // Vorinitialisierung des Zeichnens durch update() public void update (Graphics g) { // Buffer bei Bedarf erzeugen if (buffer == null) { // Wenn noch kein buffer besteht, dann erstellen und bg erzeugen buffer = createImage (600, 600); bg = buffer.getGraphics(); //bg = buffered Graphics, buffer speichert alles und erstellt immer wieder } // Auf den Buffer zeichnen paint (bg); //Aufruf von paint-Methode, auf buffered Graphics wird gemalt // Den Buffer einblenden g.drawImage (buffer, 0, 0, this); // nun wird auf g gezeichnet } //paint wird in update() aufgerufen und agiert nun mit folgendem Code public void paint (Graphics g) { if (ammalen) { //ammalen wird auf true gesetzt bei paint() g.setColor (farbe); // Festlegung der Farbe // Es folgt nun das Linienmalen an verschiedenen Koordinaten relativ zur Mausposition g.drawLine (xidalt, yidalt, xidneu, yidneu); g.drawLine (xidalt + 2, yidalt, xidneu + 2, yidneu); g.drawLine (xidalt, yidalt + 2, xidneu, yidneu + 2); g.drawLine (xidalt + 2, yidalt + 2, xidneu + 2, yidneu + 2); g.drawLine (xidalt + 1, yidalt, xidneu + 1, yidneu); g.drawLine (xidalt, yidalt + 1, xidneu, yidneu + 1); g.drawLine (xidalt + 1, yidalt + 1, xidneu + 1, yidneu + 1); g.drawLine (xidalt + 3, yidalt, xidneu + 3, yidneu); g.drawLine (xidalt, yidalt + 3, xidneu, yidneu + 3); g.drawLine (xidalt + 3, yidalt + 3, xidneu + 3, yidneu + 3); g.drawLine (xidalt - 1, yidalt, xidneu - 1, yidneu); g.drawLine (xidalt, yidalt - 1, xidneu, yidneu - 1); g.drawLine (xidalt - 1, yidalt - 1, xidneu - 1, yidneu - 1); g.drawLine (xidalt - 3, yidalt, xidneu - 3, yidneu); g.drawLine (xidalt, yidalt - 3, xidneu, yidneu - 3); g.drawLine (xidalt - 3, yidalt - 3, xidneu - 3, yidneu - 3); g.drawLine (xidalt - 2, yidalt, xidneu - 2, yidneu); g.drawLine (xidalt, yidalt - 2, xidneu, yidneu - 2);

g.drawLine (xidalt - 2, yidalt - 2, xidneu - 2, yidneu - 2); } }

// MouseMotionListener wurde anfangs implementiert und folgende Methode sind fr die Interaktion notwendig // wird die Maus bewegt, dann mouseMoved (agiert auf das Event MouseEvent e) public void mouseMoved (MouseEvent e) { ammalen = false; // Wenn die Maus sich nur bewegt, aber nicht gedrckt wird -> ammalen = false // Ersten X- und Y-Wert setzen xidalt = e.getX(); // X-Koordinate fr den Start des Linienzeichnens yidalt = e.getY(); // Y-Koordinate fr den Start des Linienzeichnens } // wird die Maus gedrckt, dann MouseDragged (agiert auch auf das Event MouseEvent e) public void mouseDragged (MouseEvent e) { if (ammalen == true) { /*Beim Bewegen der Maus werden die Variablen immer wieder neu deklariert und liefern der paint-Methode laufend Koordinateninformationen */ xidalt = xidneu; //xidalt wird auf xidneu gesetzt, passiert beim "Linienzeichnen" laufend yidalt = yidneu; //yidalt wird auf yidneu gesetzt, passiert beim "Linienzeichnen" laufend } else { // Wenn die Maustaste nicht gedrckt ist, einfach wie sonst auch xidalt und yidalt festlegen xidalt = e.getX(); //xidalt bekommt aktuellen X-Wert yidalt = e.getY(); //yidalt bekommt aktuellen Y-Wert } ammalen = true; // Maus ist gedrckt -> ammalen = true // Neuen X- und Y-Wert setzen xidneu = e.getX(); // X-Koordinate fr das "Ende" des Linienzeichnens yidneu = e.getY(); // Y-Koordinate fr das "Ende" des Linienzeichnens } // Anfngliche ActionListener-Implementierung fr Reaktion auf das Klicken von Schaltflchen public void actionPerformed (ActionEvent e) { // String benutzereingabe erhlt immer das aktuellste Klicken einer Schaltflche String benutzereingabe = e.getActionCommand(); if (benutzereingabe == "Neu") { //Beim Klicken der Schaltflche Neu bg.setColor (Color.WHITE); //Hintergrund wei einfrben bg.fillRect (0, 0, 600, 600); // buffered Graphics wieder auf normale Gre setzen } if (benutzereingabe == "Schlieen") { //Beim Klicken der Schaltflche Schlieen this.dispose(); // Fenster schlieen } if (benutzereingabe == "Rot") { // Beim Klicken der Schaltflche Rot farbe = Color.RED; // Malfarbe ist ab jetzt rot }

if (benutzereingabe == "Grn") { // Beim Klicken der Schaltflche Grn farbe = Color.GREEN; // Malfarbe ist ab jetzt grn } if (benutzereingabe == "Blau") { // Beim Klicken der Schaltflche Blau farbe = Color.BLUE; // Malfarbe ist ab jetzt blau } if (benutzereingabe == "Gelb") { // Beim Klicken der Schaltflche Radiergummi farbe = Color.YELLOW; // Malfarbe ist ab jetzt wei zum Radieren } if (benutzereingabe == "Cyan") { // Beim Klicken der Schaltflche Cyan farbe = Color.CYAN; // Malfarbe ist ab jetzt cyan } if (benutzereingabe == "Magenta") { // Beim Klicken der Schaltflche Magenta farbe = Color.MAGENTA; // Malfarbe ist ab jetzt magenta } if (benutzereingabe == "Radiergummi") { // Beim Klicken der Schaltflche Radiergummi farbe = Color.WHITE; // Malfarbe ist ab jetzt wei zum Radieren } if (benutzereingabe.equals ("Schwarz")) { // Beim Klicken der Schaltflche Schwarz farbe = Color.BLACK; // Malfarbe ist ab jetzt schwarz } }

/* WindowListener-Implementierung (Es werden nicht bei allen Methoden Anweisugen bentigt, weil das Fenster auf bestimmte Zustnde nicht reagieren muss */ public void windowOpened (WindowEvent e) { // Anweisung nicht notwendig } public void windowActivated (WindowEvent e) { // Anweisung nicht notwendig } public void windowDeactivated (WindowEvent e) { // Anweisung nicht notwendig } public void windowIconified (WindowEvent e) { // Anweisung nicht notwendig } public void windowDeiconified (WindowEvent e) { // Anweisung nicht notwendig } public void windowClosing (WindowEvent e) { // Klick auf die X-Schaltflche des Fensters // Fenster schlieen this.dispose(); } public void windowClosed (WindowEvent e) { // Wenn das Fenster geschlossen ist // Programm beenden System.exit (0); } }

Das könnte Ihnen auch gefallen