Zeichnen einer Geraden im JFrame

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,
ich habe hier diese Aufgabe gefunden:

http://www.java-forum.org/de/viewtopic.php?t=49795&highlight=linie+zeichnen+mouselistener

so, das ist im Prinzip voran ich mich orientieren kann.
Jedoch muss ich für meine Aufgabe nur MouseListener und nicht die Adapterklasse verwenden.
Zudem soll ich mit der Methode getGraphics arbeiten & MouseClicked verwenden...

Ich habe das versucht umzuschreiben...:

Code:
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.Graphics;
import java.awt.event.MouseListener;

public class test extends JFrame implements MouseListener{ 
   int xAnf, yAnf; 

   
   
   public void mouseClicked(MouseEvent e){
	   xAnf = e.getX();
	   yAnf = e.getY();
	   repaint();

   }

	public void paint(Graphics g){
	      super.paint(g); 
	      g.getGraphics(xAnf, yAnf); 
	   }

	   public static void main(String[] args) { 
	      JFrame f = new JFrame("Gerade"); 
	      
	      f.addMouseListener(new test());

	      f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); 
	      f.setSize(400, 400); 

	      f.setVisible(true); 
	   } 
	}

Kann mir da einer weiterhelfen?
 
Mit getGraphics kann es schon aus rein technischen Gründen niemals richtig funktionieren, der Fehler liegt also in der Aufgabenstellung.
Eine korrekte Lösung hast du bereits selbst verlinkt.
 
Hmmm,
also die Aufgabenstellung lautet ganz genau so:
"Erstellen Sie eine Java-Applikation DrawLines. Diese soll auf einen JFrame mit Hilfe zweier
Mausklicks Linien malen. Der erste Mausklick gibt die Anfangskoordinate und der zweite die Endkoordinate
an. Mit der Methode getGraphics() können Sie sich den Grafikkontext zurückliefern
lassen und direkt aus der Methode mouseClicked auf das JFrame zeichnen. Implementieren Sie
dieses unter Verwendung des Interface MouseListener."

Also get die getGraphics Methode nicht?
Richtig?
 
Man kann zwar mit getGraphics eine Linie zeichnen, die verschwindet allerdings sobald das Fenster überdeckt oder minimiert wird.
Aus (unter anderem) diesem Grund wirst du in diesem Forum einige hundert mal den Hinweis finden getGraphics nicht zu verwenden.
 
Aber wenn er es doch so machen soll. So gehts:

Code:
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;

public class DrawLines extends JFrame implements MouseListener {
	
	private Point p = null;
	
	public DrawLines() { 
		this.addMouseListener(this);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setSize(400,400);
		this.setVisible(true);		
	}

	public void mouseClicked(MouseEvent e) {

		if( p == null ) p = e.getPoint();
		else {
			Graphics g = e.getComponent().getGraphics();
			g.drawLine(p.x, p.y, e.getPoint().x, e.getPoint().y);
			p = null;
		}	
	}

	public static void main(String[] a) { new DrawLines(); }

	public void mouseEntered (MouseEvent e) {}
	public void mouseExited (MouseEvent e) {}
	public void mousePressed (MouseEvent e) {}
	public void mouseReleased(MouseEvent e) {}
}
 
Ok,
kannst Du mit viell helfen aus der Lösung von 'Leroy42' die MouseAdapter Methode zu entfernen, sodass es nur noch mit MouseListener klappt?

Die Lösung war diese:
Code:
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Gerade extends JPanel { 
   int xAnf, yAnf; 
   int xEnd, yEnd; 
    
   public Gerade() { 
      addMouseListener(new MouseAdapter() { 
         public void mousePressed(MouseEvent e) { 
            xAnf = xEnd = e.getX(); 
            yAnf = yEnd = e.getY(); 
            repaint(); 
         }}); 
      addMouseMotionListener(new MouseMotionAdapter() { 
         public void mouseDragged(MouseEvent e) { 
            xEnd = e.getX(); 
            yEnd = e.getY(); 
            repaint(); 
         }}); 
   } 
   protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawLine(xAnf, yAnf, xEnd, yEnd); 
   } 

   public static void main(String[] args) { 
      JFrame f = new JFrame("Gerade"); 
      f.getContentPane().add(new Gerade()); 
      f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); 
      f.setSize(400, 400); 
      f.setLocationRelativeTo(null); 
      f.setVisible(true); 
   } 
}
 
Du musst eigentlich genau das Gleiche (aber nicht das Selbe) schreiben wie in meiner Loesung, nur anstatt MouseAdapter MouseListener und dann noch die 4 Methoden die bei meiner Loesung ganz unten stehen nach dem 1. Semikolon in Zeile 15 reinkopieren.
Ach ja und noch mousePressed mit mouseClicked tauschen.
 
Danke, werde ich versuchen, Deine Antwort habe ich noch nicht gelesen beim Posten...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben