Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können

Alex2013

Bekanntes Mitglied
Hallo Leute,

mein Programm ist jetzt fast komplett lauffähig.
Das ContentPane auf dem gezeichnet wird lädt und man kann auch zeichnen.
Einziger Makel, wenn man auf den Button Clear drückt, wird in der Position Top ein weiterer Button "Clear" angezeigt. Weiß evtl. jemand wie man dieses Problem umgehen kann?

Aber zum Hauptproblem:
Wenn ich auf den Button Exit klicke, schließt er das Fenster, wie es gewollt ist.
Wenn ich auf den Button Clear klicke, zeichnet er es zwar weiß, um die Zeichnung zu überdecken, wenn ich aber erneut zeichne und anschließend wieder auf den Button klicke, passiert nichts. Soll heißen, das Gezeichnete wird nicht überdeckt. Wie kann ich das korrigieren?
Ansonsten funktioniert das Programm wie es soll.

Hier der Code:

Java:
[code]
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

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

public class Paint extends JPanel implements MouseListener, MouseMotionListener
{	
	private static final long serialVersionUID = 1L;
	
	private int startX,startY,tempX,tempY;
	static JButton b1,b2;
	private Graphics2D g2;
	public final static Color WHITE = new Color(255, 255, 255);
	
	public Paint()
	{
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
	}
	
	public static void main (String args[]) throws Exception
	{
		JFrame f=new JFrame("Paint Programm");
		f.setLayout(new BorderLayout());
		ButtonListener1 bl1= new ButtonListener1(f);
		
		Paint paint1=new Paint();
		paint1.setLayout(new BorderLayout());
		
		b1=new JButton("Exit");
		b2=new JButton("Clear");
		
		b1.setActionCommand("Exit");
		b2.setActionCommand("Clear");
		
		b1.addActionListener(bl1);
		b2.addActionListener(bl1);
		
		f.getContentPane().add(b1,BorderLayout.NORTH);
		f.getContentPane().add(b2,BorderLayout.SOUTH);
		
		f.getContentPane().add(new Paint());
		
		f.setSize(500,400);
		f.setLocation(200,100);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}

	public void paintComponent(Graphics g)
	{
		g2=(Graphics2D) g;
		g2.setPaintMode();
		g2.drawLine(startX, startY, tempX, tempY);
		startX=tempX;
		startY=tempY;
		//tempX wird hier der variablen startX zugewiesen, da der endpunkt der einen linie ja wieder als anfangspunkt fuer die neue Linie gilt
		//ebenso wie tempY startY zugewiesen wird, denn die Endposition der einen Linie ist wieder der anfangspunkt der neuen linie
		//man uebergibt der drawLine methode die vier geforderten werte
		//zum einen den anfangsstart und endpunkt der x achse und zum anderen den anfangsstart und endpunkt der y achse
	}
	
	@Override
	public void mouseDragged(MouseEvent me) 
	{
		tempX=me.getX();
		tempY=me.getY();
		repaint();
		//die variablen temp gelten hierbei nur als Platzhalter fuer den end und anfangspunkt
		//denn wenn die Maus bewegt wird, bekommt die variable tempX den endwert der Mausbewegung in X richtung zugewiesen
		// und die tempY variable bekommt den endwert der Mausbewegung in Y Richtung zugewiesen. 
		//Diese Werte gelten aber auch wieder als Anfangspunkt, nachdem die repaint Methode ausgefuehrt wurde
	}

	@Override
	public void mousePressed(MouseEvent me) 
	{
		startX=me.getX();
		startY=me.getY();
		//Hier wird als erstes der gedrueckten Maustaste die x und die y position zugewiesen
		//und diese in der jeweiligen Variable gespeichert startX und startY
		//die variable startX bekommt die Startposition X der gedrueckten Maustaste zugewiesen
		//die variable startY bekommt die Startposition Y der gedrueckten Maustaste zugewiesen
	}
	
	@Override
	public void mouseMoved(MouseEvent arg0) 
	{
		
	}

	@Override
	public void mouseClicked(MouseEvent arg0) 
	{
		
	}

	@Override
	public void mouseEntered(MouseEvent arg0) 
	{
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) 
	{
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) 
	{
		
	}
}
	class ButtonListener1 implements ActionListener
	{
		JFrame f;
		public ButtonListener1(JFrame f) 
		{
			super();
			this.f=f;
		}

		@Override
		public void actionPerformed(ActionEvent ae) 
		{
			if(ae.getActionCommand().equals("Exit"))
			{
				f.dispose();
			}
			else if(ae.getActionCommand().equals("Clear"))
			{       //Das hier ist der Bereich, der noch nicht funktioniert, wie er sollte
				f.getContentPane().setBackground(Color.white);
			}
		}
	}
[/code]

Vielen Dank schon mal für hilfreiche Antworten! 🙂

Lg
 
Naja du änderst ja einfach nur den Hintergrund von "grau?" zu weiß, das machst du ja schon beim ersten Klick. Dass dein gemaltes verschwindet ist nur ein Nebeneffekt weil setBackground repaint(9 aufruft. Was du machen könntest ist das setBackground schon da zu setzen wo du das Panel addest (z.B. danach:
f.getContentPane().add(new Paint());
f.getContentPane().setBackground(Color.WHITE);
) wenn du wirklich auf weißem Hintergrund zeichnen möchtest (wenn nicht kannst du es auch weglassen)

und dann in deinem Listener einfach f.getContentPane().repaint() aufrufen.
 
Zuletzt bearbeitet:
Ich danke dir vielmals! 🙂

Hättest du evtl. einen Tipp warum sobald ich auf den Frame klicke um zu zeichnen ein dritter Button oben erscheint?
Es erscheint ein zweiter "Clear" Button unter dem "Exit" Button. Wenn ich auf clear drücke verschwindet dieser auch wieder, aber sobald ich den Frame wieder anklicke um zu zeichnen wird er dort wieder gebildet...
Ich kann mir das nicht erklären... :-(

Habe ich evtl. an einer Stelle im Code einen Button hinzugefügt und ich sehe es nicht oder so etwas in der Art?

Lg alex
 

Zurück
Oben