Probleme mit getGraphics()



  • Hallo ich möchte einen MouseListener implementieren, der auf Mouse Klicks reagiert. Dabei soll an der stelle des Mouse Cursors etwas zeichnen, dafür benötige einen Handle auf das Grahics. Das wollte ich mir mit getGraphics() besorgen. Allerdings bekomme ich immer die Meldung das die Funktion in der Klasse nicht aufgelöst werden kann . Hier ist mein Quellcode. Es wäre schön wenn mir jemand helfen können. Was ich nicht Verstehe, ist das die Funktion in der Component - Klasse definiert ist. Und jede klasse ist ja praktisch davon abgeleitet. also eigentlich sollte der Aufruf doch überall funktionieren. ODer etwa nicht.

    import java.awt.event.*;
    import java.awt.Graphics;
    
    public class MyMouseListener 
    extends MouseAdapter
    implements MouseListener{
    
    	// --------------------------------------------
    	// Default - Konstruktor	
    	// --------------------------------------------
    	public MyMouseListener(){
    	}
    
    	// --------------------------------------------
    	// Action für Mausklick	
    	// --------------------------------------------
    	public void mousePressed(MouseEvent event){
    
    		Graphics g = getGraphics();
    
    		// Prüfe ob die Mouse in dem Gültigen Bereich ist.
    		int x = event.getX(), y = event.getY();
    
    		//Graphics g = getGraphics();
    
    	}
    }
    


  • Deine Klasse erbt von MauseAdapter , nicht von Component . Außerdem kannst du dir implements MouseListener sparen, weil MauseAdapter bereits das Interface implementiert.



  • Danke für die Antwort aber wie muss es richtig sein



  • Was willst du den überhaupt machen?

    Wenn du etwas zeichnen möchtest, so ist getGraphics fast immer falsch. So ziemlich alles was gezeichnet wird sollte in der Methode paint, bzw. paintComponent für Swing, gemacht werden.

    Du solltest also in einer aus Component abgeleiteten Methode paint, bwz. aus JComponent abgeleitet paintComponent, überschreiben und dort drin zeichnen.



  • Versuch mal ein der Stelle wo du hinklickst ein JPanel oder ähnliches anzulegen. Da kannst du dann zeichnen wie es Icarus beschrieben hat. Dein Mouselistener muss dazu natürlich die Komponente kennen die angeklickt wurde.



  • Hallo danke ich möchte als einstieg ein kleines Tic Tac Toe spiel programmieren-.



  • Ja, oftmals ist es nicht schlecht vorhin noch etwas kleineres mit GUI zu machen. GUi-Programmierung ist leider gar nicht so leicht.

    Hier mal ein kleines Beispiel, das ich für mich vor längerem mal ausprobiert hatte. Achte dabei vor allem auf die paintComponent-Methode und die mouseRealesed-Methode.

    So als kleiner Denkanstoss (ich glaube irgendwo ist ein kleiner Fehler drin. Falls beim drafklicken noch nichts passiert, dann ändere mal die Grösse des Fensters):

    package clickdemo;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Main extends JFrame {
    
    	private Container c;
    	private ClickPanel clickPanel;
    
    	Main(){
    
    		c = getContentPane();
    
    		// clickPanel is initialized
    		clickPanel = new ClickPanel();
    		clickPanel.setBackground(Color.RED);
    
    		// clickPanel is added to the contentPane
    		c.add( clickPanel, BorderLayout.CENTER );
    
    		this.setSize( 800, 600 );
    		this.setVisible(true);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    
    	public static void main(String[] args) {
    		// GUI must be realized on EDT
    		EventQueue.invokeLater(new Runnable(){
    			@Override
    			public void run(){
    				new Main();
    			}
    		});
    
    	}
    
    }
    
    class ClickPanel extends JPanel implements MouseListener {
    
    	List<Point> list;
    
    	public ClickPanel(){
    
    		list = new ArrayList<Point>();
    		this.addMouseListener( this );  // added to MouseListener
    
    	}
    
    	// all ovals are drawn within the paintComponent-Method
    	@Override
    	public void paintComponent(Graphics g){
    		super.paintComponent(g); // mandatory call to super class to clean the window
    
    		for( int i = 0; i < list.size(); i++){
    			g.fillOval( list.get(i).x, list.get(i).y, 10, 10 );
    		}
    
    	}
    
    	@Override
    	public void mouseClicked(MouseEvent e) {}
    
    	@Override
    	public void mouseEntered(MouseEvent e) {}
    
    	@Override
    	public void mouseExited(MouseEvent e) {}
    
    	@Override
    	public void mousePressed(MouseEvent e) {}
    
    	@Override
    	public void mouseReleased(MouseEvent e) {
    
    		list.add( new Point( e.getX(), e.getY() ) );
    		this.repaint();
    
    	}
    
    }
    

Anmelden zum Antworten