1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Java Paint

Discussion in 'Programmieren' started by sweikelt, May 28, 2008.

Thread Status:
Not open for further replies.
  1. sweikelt

    sweikelt Byte

    servus, bin neu hier und hab auch gleich mal eine frage
    und zwar programmiere ich für einen programmierbeleg ein malprogramm in java
    hat alles ganz gut geklappt, nur hab ich mir nun überlegt, den code neu zu schreiben und das aussehen zu verschönern.
    dazu habe ich aus Frame JFrame usw gemacht.
    nun leider bin ich beim programmieren auf einen fatalen fehler gestoßen, den ich durch mehrfaches try&error-prinzip versucht habe, auszulöschen, was mir leider nicht gelungen ist
    also wenn ich mein programm starte, dann kann ich keine linien zeichnen, bzw die linien verschwinden gleich wieder und ich finde den fehler einfach nicht.

    vielleicht kann mir jemand weiterhelfen
    hier mal der code:
    Code:
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Point;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.*;
    
    
    public class Fenster extends JFrame implements ActionListener 
    {
    	
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 7715627779008693636L;
    	
    
    	private Malflaeche panel;
    	
    	private JMenuBar mbar;
    	
    	private JMenu mbild;
    	
    	private JMenuItem mneu;
    	
    	private JMenuItem msave;
    	
    	private JMenuItem mload;
    	
    	private JMenuItem mend;
    	
    	private JMenu mstyle;
    	
    	private JRadioButtonMenuItem mpencil;
    	
    	private JRadioButtonMenuItem mrect;
    	
    	private JRadioButtonMenuItem mcircle;
    	
    	private ButtonGroup mbgstyle;
    	
    	private JMenu mcolor;
    	
    	private JRadioButtonMenuItem mrot;
    	   
    	private JRadioButtonMenuItem mgruen;
    	   
    	private JRadioButtonMenuItem mblau;
    	   
    	private JRadioButtonMenuItem mcyan;
    	   
    	private JRadioButtonMenuItem mmagenta;
    	   
    	private JRadioButtonMenuItem mgelb;
    	   
    	private JRadioButtonMenuItem mschwarz;
    	
    	private ButtonGroup mbgcolor;
    
    	private JMenu hcolor;
    	
    	private JRadioButtonMenuItem hrot;
    	   
    	private JRadioButtonMenuItem hgruen;
    	   
    	private JRadioButtonMenuItem hblau;
    	   
    	private JRadioButtonMenuItem hcyan;
    	   
    	private JRadioButtonMenuItem hmagenta;
    	   
    	private JRadioButtonMenuItem hgelb;
    	   
    	private JRadioButtonMenuItem hschwarz;
    	
    	private ButtonGroup mbghcolor;
    
    	
    	public Fenster()
    	{
    		super("Malen");
    		Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
            this.setSize(screen);  this.setVisible(true);
    		this.setSize(600,300);
    		this.setVisible(true);
            
            mbar = new JMenuBar();
            
            mbild = new JMenu("Bild");     
            mneu = new JMenuItem("Neu");
            msave = new JMenuItem("Speichern");
            mload = new JMenuItem("Laden");
            mend = new JMenuItem("Beenden");
            
            mbar.add(mbild);
            mbild.add(mneu);
            mbild.add(msave);
            mbild.add(mload);
            mbild.add(mend);
            
            mstyle = new JMenu("Zeichenart");
            mpencil = new JRadioButtonMenuItem("Stift");
            mrect = new JRadioButtonMenuItem("Rechteck");
            mcircle = new JRadioButtonMenuItem("Kreis");
            mbgstyle = new ButtonGroup(); //nur eine Auswahl möglich
            
            mbar.add(mstyle);
            mstyle.add(mpencil);
            mstyle.add(mrect);
            mstyle.add(mcircle);
            mbgstyle.add(mpencil);
            mbgstyle.add(mrect);
            mbgstyle.add(mcircle);
            
            mcolor= new JMenu("Zeichenfarbe");
            mrot = new JRadioButtonMenuItem ("Rot");
            mgruen = new JRadioButtonMenuItem ("Grün");
            mblau = new JRadioButtonMenuItem ("Blau");
            mcyan = new JRadioButtonMenuItem ("Cyan");  
            mmagenta = new JRadioButtonMenuItem ("Magenta");
            mgelb = new JRadioButtonMenuItem ("Gelb");
            mschwarz = new JRadioButtonMenuItem ("Schwarz");
            mbgcolor = new ButtonGroup();  //nur eine Auswahl möglich
            mbar.add(mcolor);
            mcolor.add(mrot);
            mcolor.add(mgruen);
            mcolor.add(mblau);
            mcolor.add(mcyan);
            mcolor.add(mmagenta);
            mcolor.add(mgelb);
            mcolor.add(mschwarz);
            mbgcolor.add(mrot);
            mbgcolor.add(mgruen);
            mbgcolor.add(mblau);
            mbgcolor.add(mcyan);
            mbgcolor.add(mmagenta);
            mbgcolor.add(mgelb);
            mbgcolor.add(mschwarz);
            
            mrot.setBackground(Color.RED);
            mgruen.setBackground(Color.GREEN);
            mblau.setBackground(Color.BLUE);
            mcyan.setBackground(Color.CYAN);
            mmagenta.setBackground(Color.MAGENTA);
            mgelb.setBackground(Color.YELLOW);
            mschwarz.setBackground(Color.BLACK);
            mblau.setForeground(Color.WHITE);	//zur besseren Betrachtung die Textfarbe auf weiß
            mschwarz.setForeground(Color.WHITE);//zur besseren Betrachtung die Textfarbe auf weiß
            
            hcolor= new JMenu("Hintergrundfarbe");
            hrot = new JRadioButtonMenuItem ("1");
            hgruen = new JRadioButtonMenuItem ("2");
            hblau = new JRadioButtonMenuItem ("3");
            hcyan = new JRadioButtonMenuItem ("4");  
            hmagenta = new JRadioButtonMenuItem ("5");
            hgelb = new JRadioButtonMenuItem ("6");
            hschwarz = new JRadioButtonMenuItem ("7");
            mbghcolor = new ButtonGroup();	//nur eine Auswahl möglich
            mbar.add(hcolor);
            hcolor.add(hrot);
            hcolor.add(hgruen);
            hcolor.add(hblau);
            hcolor.add(hcyan);
            hcolor.add(hmagenta);
            hcolor.add(hgelb);
            hcolor.add(hschwarz);
            mbghcolor.add(hrot);
            mbghcolor.add(hgruen);
            mbghcolor.add(hblau);
            mbghcolor.add(hcyan);
            mbghcolor.add(hmagenta);
            mbghcolor.add(hgelb);
            mbghcolor.add(hschwarz);
            
            hrot.setBackground(Color.RED);
            hgruen.setBackground(Color.GREEN);
            hblau.setBackground(Color.BLUE);
            hcyan.setBackground(Color.CYAN);
            hmagenta.setBackground(Color.MAGENTA);
            hgelb.setBackground(Color.YELLOW);
            hschwarz.setBackground(Color.BLACK);
    
            this.setJMenuBar(mbar);
            
        	mneu.addActionListener(this);
            msave.addActionListener (this);
            mload.addActionListener (this);
            mend.addActionListener (this);
            mpencil.addActionListener (this);
            mrect.addActionListener (this);
            mcircle.addActionListener (this);
            mrot.addActionListener (this);
            mgruen.addActionListener (this);
            mblau.addActionListener (this);
            mcyan.addActionListener (this);
            mmagenta.addActionListener (this);
            mgelb.addActionListener (this);
            mschwarz.addActionListener (this);
            hrot.addActionListener (this);
            hgruen.addActionListener (this);
            hblau.addActionListener (this);
            hcyan.addActionListener (this);
            hmagenta.addActionListener (this);
            hgelb.addActionListener (this);
            hschwarz.addActionListener (this);
            
            panel = new Malflaeche();
            getContentPane().add(BorderLayout.CENTER,panel);
    		setVisible(true);
    	 
    	}
    	
    	
    
    	
    	public void actionPerformed (ActionEvent e) {
            String aktion = e.getActionCommand();
            if (aktion.equals ("Neu"))
            {    	
            	
            	
            	
            }
            
            if (aktion.equals ("Beenden")) {
               this.dispose();
            }
            if (aktion.equals ("Rot")) {
            	
            	
               
            }
            if (aktion.equals ("Grün")) {
            	
               
               
            }
            if (aktion.equals ("Blau")) {
            	
               
            }
            if (aktion.equals ("Cyan")) {
            	
               
            }
            if (aktion.equals ("Magenta")) {
            	
               
            }
            if (aktion.equals ("Gelb")) {
            	
               
            }
            if (aktion.equals ("Schwarz")) {
            	
               
            }
            if (aktion.equals ("1")) {
            	
            	panel.setBackground(Color.RED);
                
            }
            if (aktion.equals ("2")) {
            	
            	panel.setBackground(Color.GREEN);
                
            }
            if (aktion.equals ("3")) {
            	
            	panel.setBackground(Color.BLUE);
                
            }
            if (aktion.equals ("4")) {
            	
            	panel.setBackground(Color.CYAN);
                
            }
            if (aktion.equals ("5")) {
            	
            	panel.setBackground(Color.MAGENTA);
                
            }
            if (aktion.equals ("6")) {
            	
            	panel.setBackground(Color.YELLOW);
                
            }
            if (aktion.equals ("7")) {
            	
            	panel.setBackground(Color.BLACK);
                
            }
    
            
    	}
    
    	
    	public static void main(String[] args) 
    	{
    		Fenster f = new Fenster();
            JFrame.setDefaultLookAndFeelDecorated(false);	//bei Windows wird die Taskleiste nicht verdeckt
            f.setExtendedState(JFrame.MAXIMIZED_BOTH);
            f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            
            
            
    
            
            
    
            
    
    	}
    
    }
    
    
    und hier gehts weiter zur zweiten klasse
    Code:
    import javax.swing.*;
    
    import java.awt.*;
    import java.awt.event.*;
    public class Malflaeche extends JPanel implements MouseListener, MouseMotionListener
    {
    
    	private static final long serialVersionUID = -2169353357630986770L;
    
    	private Point aktuellerPunkt;
    	
    	private Point vorigerPunkt;
    	
    	public Malflaeche()
    	{
    		
    		
    		setSize(600,500);
    		setBackground(Color.WHITE);
    		setVisible(true);
    		addMouseListener(this);
    		addMouseMotionListener(this);
    		
    		
    
    	
    	}
    	
    	public void setAktuellerPunkt(Point p)
        {
            aktuellerPunkt = p;
        }
    
        public void neuerAktuellerPunkt(Point p)
        {
            vorigerPunkt = aktuellerPunkt;
            aktuellerPunkt = p;
        }
        
        
     
    
        
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            
            Graphics2D g2 = (Graphics2D) g;
            
        	       
        			g2.setColor(Color.RED);
        			g2.drawLine(10, 10, 100, 50 );
        			g2.drawRect(20, 40, 20, 20);
        			g2.drawOval(30, 30, 20, 20);
        			if (aktuellerPunkt != null)
        			{
        			g.setColor(Color.BLACK);
        			g.drawLine(aktuellerPunkt.x,aktuellerPunkt.y,vorigerPunkt.x,vorigerPunkt.y);
        			
        		    
        			
        			}
        }
        public void mousePressed(MouseEvent e)
        {
        	
            Point p = e.getPoint();
            setAktuellerPunkt(p);
            
        }
    
        public void mouseReleased(MouseEvent e)
        { }
    
    
        public void mouseClicked(MouseEvent e)
        { 
        	Point p = e.getPoint();
            neuerAktuellerPunkt(p);
            repaint();
        	
        	
        }
    
        public void mouseEntered(MouseEvent e)
        { }
    
     
        public void mouseExited(MouseEvent e)
        { }
    
    
        public void mouseMoved(MouseEvent e)
        { }
    
     
        public void mouseDragged(MouseEvent e)
        {
            Point p = e.getPoint();
            neuerAktuellerPunkt(p);
            repaint();
        }
        
    
    
    }
    
    
    vielen dank schonmal im voraus
     
  2. sweikelt

    sweikelt Byte

    sorry, weiß nicht, wie man editieren kann :(
    hab jetzt ne extra steuerungsklasse gemacht, wegen der übersicht, aber jetzt kann ich noch nicht mal ne linie ziehen(selbst wenn ich einstelle, dass bei der mausbewegung gezeichnet werden soll)
    hab ich die listener vielleicht falsch angemeldet?
    ich verzweifle langsam
    hier nochma der code.......sind 3 klassen

    Das JFRAME:

    Code:
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.*;
    
    
    public class Fenster extends JFrame implements ActionListener 
    {
    	
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 7715627779008693636L;
    	
    
    	private Malflaeche panel;
    	
    	private JMenuBar mbar;
    	
    	private JMenu mbild;
    	
    	private JMenuItem mneu;
    	
    	private JMenuItem msave;
    	
    	private JMenuItem mload;
    	
    	private JMenuItem mend;
    	
    	private JMenu mstyle;
    	
    	private JRadioButtonMenuItem mpencil;
    	
    	private JRadioButtonMenuItem mrect;
    	
    	private JRadioButtonMenuItem mcircle;
    	
    	private ButtonGroup mbgstyle;
    	
    	private JMenu mcolor;
    	
    	private JRadioButtonMenuItem mrot;
    	   
    	private JRadioButtonMenuItem mgruen;
    	   
    	private JRadioButtonMenuItem mblau;
    	   
    	private JRadioButtonMenuItem mcyan;
    	   
    	private JRadioButtonMenuItem mmagenta;
    	   
    	private JRadioButtonMenuItem mgelb;
    	   
    	private JRadioButtonMenuItem mschwarz;
    	
    	private ButtonGroup mbgcolor;
    
    	private JMenu hcolor;
    	
    	private JRadioButtonMenuItem hrot;
    	   
    	private JRadioButtonMenuItem hgruen;
    	   
    	private JRadioButtonMenuItem hblau;
    	   
    	private JRadioButtonMenuItem hcyan;
    	   
    	private JRadioButtonMenuItem hmagenta;
    	   
    	private JRadioButtonMenuItem hgelb;
    	   
    	private JRadioButtonMenuItem hschwarz;
    	
    	private ButtonGroup mbghcolor;
    
    	
    	public Fenster()
    	{
    		super("Malen v. 0.1");
    		Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
            this.setSize(screen);  this.setVisible(true);
    		this.setSize(600,300);
    		
            
            mbar = new JMenuBar();
            
            mbild = new JMenu("Bild");     
            mneu = new JMenuItem("Neu");
            msave = new JMenuItem("Speichern");
            mload = new JMenuItem("Laden");
            mend = new JMenuItem("Beenden");
            
            mbar.add(mbild);
            mbild.add(mneu);
            mbild.add(msave);
            mbild.add(mload);
            mbild.add(mend);
            
            mstyle = new JMenu("Zeichenart");
            mpencil = new JRadioButtonMenuItem("Stift");
            mrect = new JRadioButtonMenuItem("Rechteck");
            mcircle = new JRadioButtonMenuItem("Kreis");
            mbgstyle = new ButtonGroup(); //nur eine Auswahl möglich
            
            mbar.add(mstyle);
            mstyle.add(mpencil);
            mstyle.add(mrect);
            mstyle.add(mcircle);
            mbgstyle.add(mpencil);
            mbgstyle.add(mrect);
            mbgstyle.add(mcircle);
            
            mcolor= new JMenu("Zeichenfarbe");
            mrot = new JRadioButtonMenuItem ("Rot");
            mgruen = new JRadioButtonMenuItem ("Grün");
            mblau = new JRadioButtonMenuItem ("Blau");
            mcyan = new JRadioButtonMenuItem ("Cyan");  
            mmagenta = new JRadioButtonMenuItem ("Magenta");
            mgelb = new JRadioButtonMenuItem ("Gelb");
            mschwarz = new JRadioButtonMenuItem ("Schwarz");
            mbgcolor = new ButtonGroup();  //nur eine Auswahl möglich
            mbar.add(mcolor);
            mcolor.add(mrot);
            mcolor.add(mgruen);
            mcolor.add(mblau);
            mcolor.add(mcyan);
            mcolor.add(mmagenta);
            mcolor.add(mgelb);
            mcolor.add(mschwarz);
            mbgcolor.add(mrot);
            mbgcolor.add(mgruen);
            mbgcolor.add(mblau);
            mbgcolor.add(mcyan);
            mbgcolor.add(mmagenta);
            mbgcolor.add(mgelb);
            mbgcolor.add(mschwarz);
            
            mrot.setBackground(Color.RED);
            mgruen.setBackground(Color.GREEN);
            mblau.setBackground(Color.BLUE);
            mcyan.setBackground(Color.CYAN);
            mmagenta.setBackground(Color.MAGENTA);
            mgelb.setBackground(Color.YELLOW);
            mschwarz.setBackground(Color.BLACK);
            mblau.setForeground(Color.WHITE);	//zur besseren Betrachtung die Textfarbe auf weiß
            mschwarz.setForeground(Color.WHITE);//zur besseren Betrachtung die Textfarbe auf weiß
            
            hcolor= new JMenu("Hintergrundfarbe");
            hrot = new JRadioButtonMenuItem ("1");
            hgruen = new JRadioButtonMenuItem ("2");
            hblau = new JRadioButtonMenuItem ("3");
            hcyan = new JRadioButtonMenuItem ("4");  
            hmagenta = new JRadioButtonMenuItem ("5");
            hgelb = new JRadioButtonMenuItem ("6");
            hschwarz = new JRadioButtonMenuItem ("7");
            mbghcolor = new ButtonGroup();	//nur eine Auswahl möglich
            mbar.add(hcolor);
            hcolor.add(hrot);
            hcolor.add(hgruen);
            hcolor.add(hblau);
            hcolor.add(hcyan);
            hcolor.add(hmagenta);
            hcolor.add(hgelb);
            hcolor.add(hschwarz);
            mbghcolor.add(hrot);
            mbghcolor.add(hgruen);
            mbghcolor.add(hblau);
            mbghcolor.add(hcyan);
            mbghcolor.add(hmagenta);
            mbghcolor.add(hgelb);
            mbghcolor.add(hschwarz);
            
            hrot.setBackground(Color.RED);
            hgruen.setBackground(Color.GREEN);
            hblau.setBackground(Color.BLUE);
            hcyan.setBackground(Color.CYAN);
            hmagenta.setBackground(Color.MAGENTA);
            hgelb.setBackground(Color.YELLOW);
            hschwarz.setBackground(Color.BLACK);
    
            this.setJMenuBar(mbar);
            
        	mneu.addActionListener(this);
            msave.addActionListener (this);
            mload.addActionListener (this);
            mend.addActionListener (this);
            mpencil.addActionListener (this);
            mrect.addActionListener (this);
            mcircle.addActionListener (this);
            mrot.addActionListener (this);
            mgruen.addActionListener (this);
            mblau.addActionListener (this);
            mcyan.addActionListener (this);
            mmagenta.addActionListener (this);
            mgelb.addActionListener (this);
            mschwarz.addActionListener (this);
            hrot.addActionListener (this);
            hgruen.addActionListener (this);
            hblau.addActionListener (this);
            hcyan.addActionListener (this);
            hmagenta.addActionListener (this);
            hgelb.addActionListener (this);
            hschwarz.addActionListener (this);
            
            panel = new Malflaeche();
            getContentPane().add(BorderLayout.CENTER,panel);
    		setVisible(true);
    	 
    	}
    	
    	
    
    	
    	public void actionPerformed (ActionEvent e) {
            String aktion = e.getActionCommand();
            if (aktion.equals ("Neu"))
            {    	
            	
            	
            	
            }
            
            if (aktion.equals ("Beenden")) {
               this.dispose();
            }
            if (aktion.equals ("Rot")) {
            	
            	
               
            }
            if (aktion.equals ("Grün")) {
            	
               
               
            }
            if (aktion.equals ("Blau")) {
            	
               
            }
            if (aktion.equals ("Cyan")) {
            	
               
            }
            if (aktion.equals ("Magenta")) {
            	
               
            }
            if (aktion.equals ("Gelb")) {
            	
               
            }
            if (aktion.equals ("Schwarz")) {
            	
               
            }
            if (aktion.equals ("1")) {
            	
            	panel.setBackground(Color.RED);
                
            }
            if (aktion.equals ("2")) {
            	
            	panel.setBackground(Color.GREEN);
                
            }
            if (aktion.equals ("3")) {
            	
            	panel.setBackground(Color.BLUE);
                
            }
            if (aktion.equals ("4")) {
            	
            	panel.setBackground(Color.CYAN);
                
            }
            if (aktion.equals ("5")) {
            	
            	panel.setBackground(Color.MAGENTA);
                
            }
            if (aktion.equals ("6")) {
            	
            	panel.setBackground(Color.YELLOW);
                
            }
            if (aktion.equals ("7")) {
            	
            	panel.setBackground(Color.BLACK);
                
            }
    
            
    	}
    
    	
    	public static void main(String[] args) 
    	{
    		Fenster f = new Fenster();
            JFrame.setDefaultLookAndFeelDecorated(false);	//bei Windows wird die Taskleiste nicht verdeckt
            f.setExtendedState(JFrame.MAXIMIZED_BOTH);
            f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            Malflaeche mf = new Malflaeche();
            Steuerung st = new Steuerung(mf);
            mf.addMouseMotionListener(st);
            mf.addMouseListener(st);
    	}
    
    }
    
    
    Das JPANEL:

    Code:
    import javax.swing.*;
    
    import java.awt.*;
    
    public class Malflaeche extends JPanel
    {
    
    	private static final long serialVersionUID = -2169353357630986770L;
    
    	private Point aktuellerPunkt;
    	
    	private Point vorigerPunkt;
    	
    	public Malflaeche()
    	{
    		
    		super();
    		setSize(600,500);
    		setBackground(Color.WHITE);
    		setVisible(true);
    
    		
    		
    
    	
    	}
    	
    	public void setAktuellerPunkt(Point p)
        {
            aktuellerPunkt = p;
        }
    
        public void neuerAktuellerPunkt(Point p)
        {
            vorigerPunkt = aktuellerPunkt;
            aktuellerPunkt = p;
        }
        
        
     
    
        
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            
            Graphics2D g2 = (Graphics2D) g;
            
        	       
        			g2.setColor(Color.RED);
        			g2.drawLine(10, 10, 100, 50 );
        			g2.drawRect(20, 40, 20, 20);
        			g2.drawOval(30, 30, 20, 20);
        			if (aktuellerPunkt != null)
        			{
        			g.setColor(Color.BLACK);
        			g.drawLine(aktuellerPunkt.x,aktuellerPunkt.y,vorigerPunkt.x,vorigerPunkt.y);
        			}
        		    
        			
        }
        
    }
    

    und die Steuerung:

    Code:
    import java.awt.*;
    import java.awt.event.*;
    
    
    class Steuerung implements MouseListener, MouseMotionListener
    {
        /**
         *  die zu steuernde MausMalen-Anwendung
         */
    	Malflaeche anwendung;
    
        /**
         *  der Konstruktor erhält die zu steuernde MausMalen-Anwendung
         *
         * @param  anw  die zu steuernde MausMalen-Anwendung
         */
        public Steuerung(Malflaeche anw)
        {
            anwendung = anw;
        }
    
        /**
         *  die mousePressed()-Methode wird beim Drücken der Maus-Taste aufgerufen
         *  sie ermittelt den Punkt, wo dies eintrat,
         *  und gibt ihn an die Anwendung weiter
         *
         * @param  e  das Maus-Ereignis
         */
        public void mousePressed(MouseEvent e)
        {
            Point p = e.getPoint();
            anwendung.setAktuellerPunkt(p);
        }
    
        /**
         *  die mouseReleased()-Methode wird beim Loslassen der Maus-Taste aufgerufen<br>
         *  dies löst hier keine Reaktion aus
         *
         * @param  e  das Maus-Ereignis
         */
        public void mouseReleased(MouseEvent e)
        { }
    
        /**
         *  die mouseClicked()-Methode wird nach dem Drücken und Wiederloslassen
         *  der Maus-Taste aufgerufen<br>
         *  dies löst hier keine Reaktion aus
         *
         * @param  e  das Maus-Ereignis
         */
        public void mouseClicked(MouseEvent e)
        { 
        	Point p = e.getPoint();
            anwendung.neuerAktuellerPunkt(p);
            anwendung.repaint();
        	
        	
        }
    
        /**
         *  die mouseEntered()-Methode wird beim Eintritt der Maus-Taste ins Fenster aufgerufen<br>
         *  dies löst hier keine Reaktion aus
         *
         * @param  e  das Maus-Ereignis
         */
        public void mouseEntered(MouseEvent e)
        { }
    
        /**
         *  die mouseExited()-Methode wird beim Austritt der Maus-Taste aus dem Fenster aufgerufen<br>
         *  dies löst hier keine Reaktion aus
         *
         * @param  e  das Maus-Ereignis
         */
        public void mouseExited(MouseEvent e)
        { }
    
        /**
         *  die mouseMoved()-Methode wird beim Bewegen der Maus ohne gedrückte Taste aufgerufen<br>
         *  dies löst hier keine Reaktion aus
         *
         * @param  e  das Maus-Ereignis
         */
        public void mouseMoved(MouseEvent e)
        { 
        	Point p = e.getPoint();
            anwendung.neuerAktuellerPunkt(p);
            anwendung.repaint();
        }
    
        /**
         *  die mouseDragged()-Methode wird beim Bewegen der Maus mit gedrückter Taste aufgerufen<br>
         *  sie ermittelt den Punkt, wo dies eintrat,<br>
         *  teilt der Anwendung das Eintreffen eines neuen aktuellen Punktes mit<br>
         *  und fordert die Neudarstellung des Malfensters an
         *
         * @param  e  das Maus-Ereignis
         */
        public void mouseDragged(MouseEvent e)
        {
            Point p = e.getPoint();
            anwendung.neuerAktuellerPunkt(p);
            anwendung.repaint();
        }
        
        
        
    }
    
     
  3. AS_X

    AS_X Halbes Megabyte

    Anstatt die Listener in der main-Methode zu registrieren, solltest du diese im Konstruktor der Klasse Malfläche registrieren:

    Code:
    Steuerung s = new Steuerung(this);
    		addMouseListener(s);
    		addMouseMotionListener(s);
    
    Dann dürften auch wieder Linien gezeichnet werden. Jedenfalls so, wie du es am Anfang hattest.

    Es gibt an deinem Code ein paar Probleme. Dazu müsste ich aber auch wissen, was genau du willst: Linie von a nach b oder eine Linie, die der Mausspur folgt.

    Allgemein solltest du eine boolean-Membervariable einführen, die dir sagen kann, ob beim Bewegen der Maus gezeichnet werden soll oder nicht: boolean capture - diese bei Pressed und Released jeweils auf true bzw false setzen und dann in Move abfragen.

    Weiterhin hast du das Problem, dass in PaintComponent immer nur der letzte aufgezeichnete Linienabschniit bzw. die letzte aufgezeichnete Linie gezeichnet wird, nie mehrere.

    Wenn du eine gerade Linie zeichnen möchtest, darfst du auch den Ursprungspunkt nicht durch neuerAktuellerPunkt ändern - du musst den Ursprungspunkt beibehalten. Sonst wird immer nur eine Linie zwischen den letzten beiden erfassten Mauspunkten gezeichnet.

    Wenn du eine beliebige (also krumme) Linie zeichnen willst, musst du die Unterabschnitte (Teillinien) speichern. Hierzu könnte man eine Klasse bauen, die zwei Punkte enthält (und immer bei Punktänderung ein Objekt davon hinzufügen); man könnte auch eine Polylinie modellieren, dabei spart man die redundanten End- und Startpunkte von jeweils aneinanderhängenden Teillinien und hätte außerdem den Vorteil, dass man bei geschickter Modellierung drawPolyline verwenden kann.

    Ich hoffe, das war dir eine Hilfe.

    Grüße
    Andreas


    PS: Hier der Teilcode für die Linienlösung:

    in Malflaeche.java
    Code:
           public Malflaeche()
    	{	
    		super();
    		setSize(600,500);
    		setBackground(Color.WHITE);
    		setVisible(true);
    		
    		Steuerung s = new Steuerung(this);
    		addMouseListener(s);
    		addMouseMotionListener(s);
    	}
    
       //...
    
        public void neuerAktuellerPunkt(Point p)
        {
        	vorigerPunkt = p;
        }
    
    in Steuerung.java
    Code:
    class Steuerung implements MouseListener, MouseMotionListener
    {
        boolean capture = false;
    
        Malflaeche anwendung;
    
        public Steuerung(Malflaeche anw)
        {
            anwendung = anw;
        }
    
        public void mousePressed(MouseEvent e)
        {
            Point p = e.getPoint();
            anwendung.setAktuellerPunkt(p);
            capture = true;
        }
    
        public void mouseReleased(MouseEvent e)
        { 
        	capture = false;
        }
    
        public void mouseClicked(MouseEvent e)
        { 
        	/*
            Point p = e.getPoint();
            anwendung.neuerAktuellerPunkt(p);
            anwendung.repaint();
        	*/
        }
    
        public void mouseEntered(MouseEvent e)
        { }
    
        public void mouseExited(MouseEvent e)
        { }
    
        public void mouseMoved(MouseEvent e)
        { 
        	if (!capture) return;
        	Point p = e.getPoint();
            anwendung.neuerAktuellerPunkt(p);
            anwendung.repaint();
        }
    
        public void mouseDragged(MouseEvent e)
        {
        	if (!capture) return;
            Point p = e.getPoint();
            anwendung.neuerAktuellerPunkt(p);
            anwendung.repaint();
        }
    }
    
     
    Last edited: May 28, 2008
  4. sweikelt

    sweikelt Byte

    hey vielen dank erstmal

    ich werde es gleich mal ausprobieren.....nur dumm, das ein anderer schon an dem code rumgewerkelt hat u nu muss ich alles wieder ändern^^

    also ich möchte mit der maus malen können, sprich wenn die mausgedrückt ist, soll eine linie gezogen werden--->diese soll der maus folgen.

    so, aber jetzt mal an die arbeit, damit ich dir sagen kann, ob deine idee funktioniert.

    [EDIT]

    so, hab den code so geschrieben, wie du gemeint hast und es funktioniert jetzt wenigstens der Listener, jetzt muss ich die MouseEvents so gestalten, dass wenn ich die maus drücke(mousepressed), ein anfangspunkt gesetzt wird und bei gedrückter maustaste (mousedragged) eine linie gezogen wird und zwar immer vom vorigem zum aktuellen punkt.
    versuche mich mal daran, bin aber gern für anregungen offen ;)
    ---------------------
    [EDIT 2]

    mit dem geänderten code ist es immernoch nicht möglich eine linie zwischen zwei punkten mit der maus zu zeichnen.....
    es scheint, als ob der vorherige Punkt "vergessen"/nicht beachtet wird, denn bei gedrückter maustaste zieht sich eine kleine linie(wird größer je schneller man die maus bewegt) hinter dem cursor her und verschwindet, sobald die maus stehen bleibt und hinterlässt dabei nur den letzten punkt.
    also ich weiß wirklich nicht woran das liegen kann
    bitte nocheinmal um hilfe

    vielen dank im voraus.
     
    Last edited: May 28, 2008
  5. AS_X

    AS_X Halbes Megabyte

    Sorry, bei mir funktioniert der gepostete Code.
    Und wie gesagt, irgendwo muss man sich die Punkte bei einer Linie merken.
    Hast du die Änderungen in neuerAktuellerPunkt gemacht?
     
    Last edited: May 28, 2008
  6. sweikelt

    sweikelt Byte

    nein hab keine veränderungen gemacht :(

    ich mein der code funktioniert zwar, aber nicht so, wie er soll.
    es soll ja mit der maus gemalt werden können(halt wie bei ms paint) und die punkte sollen verbunden werden.
    nur leider verbindet er nicht und löscht anscheinend den letzten punkt immer.

    und bei dir kannst du direkt mit der maus malen, sodass du eine zeichnung auf dem panel hast?

    vielen dank für deine bemühungen
     
  7. AS_X

    AS_X Halbes Megabyte

    1. du solltest aber die Veränderungen in der Methode machen
    2. ja, bei mir geht das Malen eines geraden Striches von a nach b.

    Anbei das Projekt in Eclipse. Kannst du über die Import-Funktion importieren.
     

    Attached Files:

  8. sweikelt

    sweikelt Byte

    ok.....ich hab den code mal implementiert und nun kann ich eine linie von punkt a zu punkt b malen, so wie du

    ich möchte aber ein malprogramm schreiben, sodass die linien miteinander verbunden werden und nicht beim nächsten klick wieder verschwinden.
    is en bisl blöd zu erklären
    es soll halt wie paint funktionieren.....ich hatte schon so ein programm mit funktionierendem code(bis auf ein paar kleine fehler), der im übrigen genau der selbe war, wie der den ich reingestellt habe
    dann habe ich mich aber entschlossen, von awt auf swing zu wechseln und siehe da, nix geht :(

    ich probiere jetzt bisl rum, um die linie zu ziehen, die ich will^^

    trotzdem ganz ganz vielen dank für deine mühe und schnelle hilfe
     
  9. AS_X

    AS_X Halbes Megabyte

    Du musst die Linien abspeichern, wie ich schon mehrfach ausgeführt habe.
     
  10. sweikelt

    sweikelt Byte

    tut mir leid, bin manchmal etwas begriffsstutzig.

    also um die linien abzuspeichern wäre doch ne arraylist das beste, oder wie seh ich das?
     
  11. AS_X

    AS_X Halbes Megabyte

    Du könntest eine neue Klasse erstellen, die ungefähr so aussieht:

    Code:
    import java.awt.Point;
    import java.awt.Color;
    import java.awt.Graphics2D;
    
    public class Line
    {
        private Point startPoint;
        private Point endPoint;
        private Color color;
    
        public void setStartPoint(Point p) { startPoint = p; }
        public void setEndPoint(Point p) { endPoint = p; }
        public void setColor(Color c) { color = c; }
    
        public Point getStartPoint() { return startPoint; }
        public Point getEndPoint() { return endPoint; }
        public Color getColor() { return color; }
    
        public void paintMe(Graphics2D g2) {
          g2.setColor(color);
          g2.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
        }
    }
    
    Beim Starten einer Linie erzeugst du ein neues Line-Objekt und setzt den Startpunkt. Wenn die Linie fertig ist (z.B. beim Loslassen der Maustaste), setzt du den Endpunkt und speicherst die Linie beispielsweise in eine - wie von dir genannte - Arraylist.

    Code:
        ArrayList<Line> lines = new ArrayList<Line>();
    
    Beim Zeichnen durchläufst du die Arraylist und malst für jedes Line-Objekt die entsprechende Linie auf dein Panel.

    Code:
        for (Line l: lines) {
          l.paintMe(g2);
        }
    
    Diesen Code habe ich nicht getestet, also ran an die Buletten und ausprobieren. :teach:

    Edit: Ich teste gerade und habe mal die Imports hinzugefügt.

    Viel Spaß weiterhin...
     
    Last edited: May 30, 2008
  12. sweikelt

    sweikelt Byte

    ich werde das mal versuchen....frag auch heut nochmal meinen prof, ob er eine andere idee hat, wie man das umsetzen kann.
    was mich wundert ist, dass ich ja schon ein funktionierendes programm in awt also mit frame anstatt jframe geschrieben hab und mit ner doppelpufferung versehen hab, bei der alles geht(bis auf den punkt, dass der hintergrund alles übermalt, was vorher da war) und diesen code hab ich dann ungefähr so in ein jframe und in ein jpanel übernommen und da funktioniert es nicht :(
    keine ahnung woran das liegen kann....
    ich probier dein geschriebenes aus, sobald ich heut etwas zeit finde.
    kann dir garnicht genug danken, dass du dich damit beschäftigst und mir versuchst zu helfen bzw schon sehr gut geholfen hast :jump:
     
  13. AS_X

    AS_X Halbes Megabyte

    Anbei der Code. Mit dem Programm kannst du Freihandlinien zeichnen. Willst du das nicht, kommentiere die schon mit "für Freihandlinien" kommentierten Zeilen aus.
     

    Attached Files:

  14. sweikelt

    sweikelt Byte

    sauber, bin so glücklich, dass es jetzt funktioniert....wahnsinn.
    werd mir deinen code jetzt mal zu gemühte führen.
    mensch ich kann dir garnicht genug danken.....du hast mir das wochenende gerettet!!!!!!
    vielen vielen vielen dank für deine bemühungen und deine arbeit und geopferte freizeit, wenn ich wüsste, wie ich das wieder gut machen könnt, würd ich's sofort machen.
    kann meine begeisterung garnicht in worte fassen :volldoll:
    :saufen: ^^

    ....werde dann mal die anderen funktionen wie linienfarbe und linienstärke einbauen und versuchen, eine methode zum speichern zu entwickeln...mit der von dir geschriebenen arraylist sollte das kein problem sein*hoffe ich*
     
  15. sweikelt

    sweikelt Byte

    ich glaube, langsam werd ich bescheuert.....ich versuche seit dem wochenende die farbe von den linien zu ändern....also wenn man die zeichenfarbe auswählt, dass die linie auch in dieser farbe mahlt, aber ich schaff's nicht
     
  16. sweikelt

    sweikelt Byte

    re:

    hab's gelöst^^
     
  17. sweikelt

    sweikelt Byte

    ein weiteres problem....

    die farben hab ich ja hinbekommen, aber nun wollte ich einbauen, dass ich auch kreise und rechtecke zeichnen kann, aber das funktioniert leider nicht so, wie ich mir das vorstelle.
    ich habe eine variable "auswahl", die 3 fälle annehmen soll(1;2;3)
    wenn auswahl = 1, dann soll ne linie gezeichnet werden können
    bei auswahl = 2 soll anstelle einer dünnen linie, kreise gezogen werden können
    bei auswahl =3 rechtecke

    leider springt mir die variable immer wieder auf 1 zurück(bzw. den wert, den ich ihr am anfang gegeben hab.
    kann mir jemand helfen?
     

    Attached Files:

  18. AS_X

    AS_X Halbes Megabyte

    Ich würde eine generische Oberklasse für die verschiedenen Zeichenelemente erstellen, da sie ja doch teilweise unterschiedliche Eigenschaften haben.
    Weiterhin wäre es sinnvoll, die aktuelle Zeichnungsart nicht in der Linie zu speichern, sondern im EventHandler-Controller, schließlich musst du bei Ellipsen ja die Ellipse erst dann zeichnen, wenn die Maustaste losgelassen wurde.

    Soviel für jetzt -
     
  19. sweikelt

    sweikelt Byte

    vielen dank, so etwas konnte ich mir schon denken....wollte das nur bisl einfacher machen^^
    ich versuch mein bestes
     
Thread Status:
Not open for further replies.

Share This Page