KeyListener + paint() / update()

HISTORY

Mitglied
Hallo zusammen

Ich möchte ein kleines Zeichenprogramm schreiben.
Nun möchte ich, wenn ich ESC drücke das mein ganzes Zeichenfeld zurückgesetzt wird.
Das Problem ist, bei e.getKeyCode bekomme ich immer 0 zurück. Wieso ?

Mein zweites Problem:
Wie kann ich nur mein Zeichenfeld updaten? Ich möchte nicht das das ganze Panel updaten/ neu zeichnen, sondern nur der Teil der sich verändert hat.

Java:
package zeichenprogramm;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;


public class Paint extends Frame implements MouseMotionListener, MouseListener,KeyListener{
	private static final long serialVersionUID = 1L;


	public static void main (String args[]) {
            new Paint();
    }
        
    private final int W_HEIGHT = 500;
    private final int W_WIDTH = 700;
    private Color selectedColor = Color.red;
    private int strichbreite = 10;
    
    private ArrayList<DrawAttribute> linie = new ArrayList<DrawAttribute>();
    
    
    public Paint() {
        super("Zeichen Programm");
        addWindowListener(new WindowClosingAdapter(true));
        setSize(W_WIDTH, W_HEIGHT);
        
        addMouseMotionListener(this);
        addMouseListener(this);
        addKeyListener(this);
        
        setBackground(Color.lightGray);
        setVisible(true);
        setResizable(false);
    }
    
    @Override
    public void paint(Graphics g) {

        g.setColor(Color.red);
        g.fillRect(30, 50, 80, 40);
        
        g.setColor(Color.green);
        g.fillRect(120, 50, 80, 40);
        
        g.setColor(Color.blue);
        g.fillRect(210 , 50, 80, 40);
        
        g.setColor(selectedColor);
        g.fillRect(300, 50, 150, 40);
        
        g.setColor(Color.black);
        g.drawString("RED",             35,  65);
        g.drawString("GREEN",           125, 65);
        g.drawString("BLUE",            215, 65);
        g.drawString("SELECTED COLOR",  305, 65);
        
//Zeichenfeld zeichnen und Umrahmen
        g.drawRect(30, 100, (W_WIDTH -30 -30), (W_HEIGHT -30 -100));
        g.setColor(Color.white);
        g.fillRect(31, 101, (W_WIDTH -30 -30 -1), (W_HEIGHT -30 -100 -1));
        g.setClip(32,102, (W_WIDTH -30 -30 -2), (W_HEIGHT -30 -100 -1));
        
        for (DrawAttribute d : linie) {
			g.setColor(d.getColor());
			g.drawLine(d.getX(), d.getY(), d.getX2(), d.getY2());
		}
       
    }
    
    
    //Mouse MotionListener
    @Override
	public void mouseDragged(MouseEvent e) {
		linie.add(new DrawAttribute(e.getX(), e.getY(),e.getX() + strichbreite, e.getY() + strichbreite, selectedColor));
	
		getGraphics().setColor(selectedColor);
		getGraphics().drawLine(e.getX(), e.getY(),e.getX() + strichbreite, e.getY() + strichbreite);
			
		repaint();
	}


	@Override
	public void mouseClicked(MouseEvent e) {
		Point p = e.getPoint();
		
// Sehen welcher Button gedrückt wurde
		if (p.x > 30 && p.x < 30 + 80 && p.y > 50 && p.y < 90) {
			selectedColor = Color.red;
		} else if (p.x > 120 && p.x < 120 + 80 && p.y > 50 && p.y < 90) {
			selectedColor = Color.green;
		} else if (p.x > 210 && p.x < 210 + 80 && p.y > 50 && p.y < 90) {
			selectedColor = Color.blue;
		}
		repaint();
		
	}
	
	@Override
	public void keyTyped(KeyEvent e) {
//		if (e.getKeyCode() == 0) {
//			linie.clear();
//			System.out.println(e.getKeyCode());
//		}
//		strichbreite = e.getKeyChar();
//		if (strichbreite > 9) {
//			strichbreite = ;
//		}
		strichbreite = (int )(Math.random() * 10);
		
		repaint();
	}
	
	@Override
	public void mouseMoved(MouseEvent e) {}
	@Override
	public void mousePressed(MouseEvent e) {}
	@Override
	public void mouseReleased(MouseEvent e) {}
	@Override
	public void mouseEntered(MouseEvent e) {}
	@Override
	public void mouseExited(MouseEvent e) {}
	@Override
	public void keyPressed(KeyEvent e) {}
	@Override
	public void keyReleased(KeyEvent e) {}
}

Falls ihr grobe / fahrlässige Fehler, oder einfach unschönen Code seht, bitte sofort Melden.
Sonst kann ich nicht daraus lernen.

Danke im Voraus ;-)

mfg
History

Hier noch das Programm.
Die Zeile addWindowClosingAdapter könnt ihr löschen.
Ich lade die Datei aus dem Grund nicht hoch, da sie nicht von mir stammt.

mfg

History
 

Anhänge

  • Programm.7z
    1,4 KB · Aufrufe: 8
Danke timestamp es funktionert genauso wie ich es mir vorgestellt habe.

Updaten kann ich, indem die update Methode überschreibe, aber wie kann ich mein
cliping bereich mitgeben (g.setClip(x1,y1,x2,y2))?

mfg
History
 
Wird dann nicht das ganze Fenster neu gezeichnet? Es sollten eben nur gerade die striche gezeichnet werden, welche dazugekommen sind.
 
Nochmals danke
Es funktioniert.
Das mit dem bereich auf dem nicht gezeichnet werden darf werde ich mit einem
if statement lösen.
 

Neue Beiträge

Zurück