Links und Funktionen
Sprachumschaltung

Navigationspfad


Inhaltsbereich

CanvasFrame.java

Java source code icon CanvasFrame.java — Java source code, 5 KB (5138 bytes)

Dateiinhalt

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Eine Klasse zur Anzeige eines graphischen Fensters.
 * 
 */

@SuppressWarnings("serial")
public class CanvasFrame {

    private JFrame frame;
    private JCanvas canvas;
    private Point lastMouseClick;
    private Point lastMouseMove;
    private final Object clickLock = new Object();
    private final Object moveLock = new Object();

    /**
     * Erzeugt ein leeres Fenster mit Titel {@code title}, Breite {@code width}
     * und Höhe {@code height}. Das Fenster wird sofort auf dem Bildschirm
     * dargestellt.
     * 
     * @param title
     *            Name des Fensters
     * @param width
     *            Breite des sichtbaren Bereichs im Fenster in Pixel
     * @param height
     *            Höhe des sichtbaren Bereichs im Fenster in Pixel
     */
    CanvasFrame(String title, int width, int height) {
	frame = new JFrame();
	canvas = new JCanvas(width, height);
	lastMouseClick = null;
	lastMouseMove = null;

	frame.setTitle(title);
	frame.setResizable(false);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	canvas.setPreferredSize(new Dimension(width, height));
	frame.getContentPane().add(canvas, BorderLayout.CENTER);
	canvas.requestFocus();
	frame.pack();
	frame.setLocationRelativeTo(null);
	frame.setVisible(true);
    }
    
    /**
     * Schliesst das Grafikfenster
     */
    public void dispose() {
    	frame.dispose();
    }
    
    /**
     * Gibt ein {@link Graphics2D}-Objekt, mit dem man im Fenster zeichnen kann.
     * 
     * @return Ein Objekt, das Methoden für graphische Operationen (z.B. das
     *         Zeichnen von Linien) bereitstellt.
     */
    public Graphics2D getGraphics() {
	return canvas.createGraphics();
    }

    /**
     * Erwirkt, dass das Fenster neu gezeichnet wird.
     */
    public void repaint() {
	frame.repaint();
    }

    /**
     * Haelt die Programmausfuehrung fuer eine bestimmte Zeit an.
     * 
     * @param ms
     *            Verzoegerung in Millisekunden
     */
    public void sleep(int ms) {
	try {
     Thread.sleep(ms);
	} catch (InterruptedException e) {
	    e.printStackTrace();
	}
    }


    /**
     * Wartet so lange, bis der Benutzer im Fenster mit der Maus geklickt hat.
     * 
     * @return Koordinaten des Klicks.
     */
    public Point waitMouseClicked() {
	try {
	    synchronized (clickLock) {
		lastMouseClick = null;
		while (lastMouseClick == null) {
		    clickLock.wait();
		}
	    }
	} catch (InterruptedException e) {
	    e.printStackTrace();
	}
	return lastMouseClick;
    }

    /**
     * Wartet so lange, bis der Benutzer im Fenster den Mauszeiger bewegt hat.
     * 
     * @return Neue Position des Mauszeigers.
     */
    public Point waitMouseMoved() {
	try {
	    synchronized (moveLock) {
		lastMouseMove = null;
		while (lastMouseMove == null) {
		    moveLock.wait();
		}
	    }
	} catch (InterruptedException e) {
	    e.printStackTrace();
	}
	return lastMouseMove;
    }

    /**
     * Um auf Tastatureingaben reagieren zu können, kann man mit dieser Methode
     * einen {@link KeyListener} registrieren.
     */
    public void addKeyListener(KeyListener keyListener) {
	canvas.addKeyListener(keyListener);
    }

    private class JCanvas extends JPanel implements MouseListener,
	    MouseMotionListener {

	// default colors
	private final Color bgColor = Color.white;
	private final Color fgColor = Color.black;

	private final BufferedImage page;

	JCanvas(int width, int height) {
	    page = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
	    Graphics2D g = page.createGraphics();
	    g.setBackground(bgColor);
	    g.clearRect(0, 0, width, height);
	    setFocusable(true);
	    addMouseListener(this);
	    addMouseMotionListener(this);
	}

	@Override
	public void paint(Graphics g) {
	    super.paint(g);
	    g.drawImage(page, 0, 0, null);
	}

	Graphics2D createGraphics() {
	    Graphics2D g = page.createGraphics();
	    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
		    RenderingHints.VALUE_ANTIALIAS_ON);
	    g.setFont(new Font("SansSerif", Font.ROMAN_BASELINE, 12));
	    g.setBackground(bgColor);
	    g.setColor(fgColor);
	    return g;
	}

	public void mouseClicked(MouseEvent e) {
	    synchronized (clickLock) {
		lastMouseClick = e.getPoint();
		clickLock.notify();
	    }
	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mousePressed(MouseEvent e) {
	}

	public void mouseReleased(MouseEvent e) {
	    mouseClicked(e);
	}

	public void mouseDragged(MouseEvent e) {
	}

	public void mouseMoved(MouseEvent e) {
	    synchronized (moveLock) {
		lastMouseMove = e.getPoint();
		moveLock.notify();
	    }
	}
    }
}

Artikelaktionen


Funktionsleiste