Freihandzeichnen

Debus

Mitglied
Hallo,

ich habe da ein Problem.

Ich soll ein Freihandzeichenprogramm erstellen. Habe da schon was gefunden, was ich nun allerdings an mein Bedürfnisse anpassen muss

1. Ich brauche keine auswahlboxen um die Farbe zu ändern, sondern muss dies auf Buttons legen.
2. Wie kann ich das Menü ausblenden.

Ich wäre glücklich, wenn mir jemand helfen kann.

Java:
import java.awt.*;

public class Malen extends java.applet.Applet
{

	/**
	 * 
	 */
	private static final long serialVersionUID = 4006549131980405195L;
	Point ptA;		// Variables.
    Point ptB;
    int x,y;
    Image Brick;
    Graphics g;
   Choice c, s, w;
   
    
    int lastx, lasty;

public void init()												// Initialize by adding
                                         //the brick background.
  {					// add the button.
      resize(700,700);		        // Resize applet.
      Brick = getImage(getDocumentBase(),"brick.gif");// Bring in image of Background.
      g = this.getGraphics();

      c = new Choice();			// Create new instance.
      c.addItem("Red");
      c.addItem("Green");
      c.addItem("Blue");
      add (c);                          // Add Color to list.

      
      
      w = new Choice();
     // w.addItem("10");			// Pen sizes.
      w.addItem("14");
      //w.addItem("18");
      //w.addItem("24");
      add (w);

      s = new Choice();
      //s.addItem("Square");		// Shapes.
      //s.addItem("Oval");
      s.addItem("FreeHand");
      add (s);			        // add the button

      Button b = new Button("Clear");  //Clear Button.
      add(b);
  }

	public boolean action(Event e, Object arg)
	{
          if(e.target instanceof Button)
          {
            repaint();
          }
	  return true;
	}


/*************************************************
      Mousedown Event.Enabled when mouse button  *
      pressed.					 *
**************************************************/


       public boolean mouseDown(Event e, int x, int y)
       {
	  ptA = new Point(x,y);

          if(c.getSelectedItem() == "Red")       // If Red selected change color to red.
          {
             g.setColor(Color.red);
          }
             if(c.getSelectedItem() == "Green")  // If Green selected change color to green. 
             {
                g.setColor(Color.green);
              }
                 if(c.getSelectedItem() == "Blue")  // If Blue selected change color to blue.
    		 {
      		    g.setColor(Color.blue);
    		 }
               //     if (s.getSelectedItem() == "Square") // If Square selected. 
	            //{
                 //     g.drawRect(x,y,100,100);	// Draw square.
	             //}
                  //   if(s.getSelectedItem() == "Oval")  // If Oval selected. 
	    	     //{
                  //      g.drawOval(x,y,100,100);  // Draw oval.
	    	     //}
                      return true;
       }


/*********************************************************
   Mousedrag Event.Used for FreeHand when drawing inside *
   the applet.                                           *
**********************************************************/


      public boolean mouseDrag(Event evt, int x, int y)
      {
	ptB = new Point(x,y);
        if(s.getSelectedItem() == "FreeHand")
        {
            if(w.getSelectedItem() == "10")
            {
                g.drawLine(ptA.x, ptA.y, ptB.x, ptB.y);
            }
                if(w.getSelectedItem() == "14")
                {
                    g.drawLine(ptA.x, ptA.y, ptB.x, ptB.y);
                    g.drawLine(ptA.x+1, ptA.y+1, ptB.x+1, ptB.y+1);
                }
		    if(w.getSelectedItem() == "18")
                    {
                      g.drawLine(ptA.x, ptA.y, ptB.x, ptB.y);
                      g.drawLine(ptA.x+1, ptA.y+1, ptB.x+1, ptB.y+1);
                      g.drawLine(ptA.x+2, ptA.y+2, ptB.x+2, ptB.y+2);
                    }
			if(w.getSelectedItem() == "24")
                        {
                          g.drawLine(ptA.x, ptA.y, ptB.x, ptB.y);
                          g.drawLine(ptA.x+1, ptA.y+1, ptB.x+1, ptB.y+1);
                          g.drawLine(ptA.x+2, ptA.y+2, ptB.x+2, ptB.y+2);
                          g.drawLine(ptA.x+3, ptA.y+3, ptB.x+3, ptB.y+3);
                        }
                        ptA = ptB;
        }
        return true;
      }
/*****************************************************
            Paint.                                   *
******************************************************/
      public void paint (Graphics g)
      {
	g.drawImage(Brick,20,40,this);

      }
  }

/********************************************************
                End of Program.                         *
*********************************************************/

Danke für Eure Hilfe

Holger
 

Debus

Mitglied
Ich meine folgendes von Choise weg auf Buttons legen

Java:
c = new Choice();         // Create new instance.
      c.addItem("Red");
      c.addItem("Green");
      c.addItem("Blue");
      add (c);

Holger
 

Gucky

Top Contributor
Entweder du machst die Farbwahl in Form von ToggleButtons, dann ändert sich fast nichts oder du machst eine Enumeration und eine Variable farbe, in die du, abhängig welcher Button geklickt wurde, die Farbe schreibst. Aber ich verstehe dein Problem nicht. Das ist doch nur ein bisschen Tipparbeit.

Das Menü ausblenden: [InstanzDesObjektes].setVisible(false);
 

Debus

Mitglied
Könnte mir freundlicherweise jemand mal das in meinem Code einbringen.
Ich kann leider kein Java (nur vb.net vb und vba)
Ich verstehe das leider nicht so ganz.
Es sind mit die letzten Aufgaben meiner Tochter, da Sie dann Info aus dem Abi abwählen kann. :=)


Also nur wie ich diese JButtons declariern muss und wie ich z. B. die Farbwahl auf 3 Buttons kriege


Danke für Eure Hilfe
Holger
 
Zuletzt bearbeitet:

Gucky

Top Contributor
So ziehmlich am Anfang steht, dass, wenn geklickt wird, wird die Methode mouseDown() aufgerufen. Dann wird, je nachden welches Element aus der Choise geklickt wurde oder vielleicht auch gar keins geklickt wurde, wird die Farbe gesetzt. Das Farbesetzen kommt dann, ohne den if-Block in den ActionListener der Buttons.

Weißt du, wie man ActionListener implementiert? Welches SDK verwendest du?

BTW ist dieses Forum aber nicht dazu da, die Hausaufgaben von anderen zu machen. Dafür gibt es die Job-Börse.

Wie steht es denn mit den Javafähigkeiten deiner Tochter aus?
 

Debus

Mitglied
Also,
da der Lehrer wirklich gut ist (Ironie) wählt Sie es wie der gesamte Kurs ab!

Ich brauche eigentlich nur mal Hilfe wie ich die Buttons generiere.

Vom Prinzip her ist ja so
Button klicken
Variable füllen
Farbgebung anhand der Variable ändern

Aber da fehlt mir immer noch der Button, und das ist irgendwie mein Porblem

Bei VB ziehst du den einfach auf die Form und gut is aber hier ??????????

Holger
 

Gucky

Top Contributor
Hier ist es genauso. Die Variable können wir wogar weglassen. Da bin ich von falschen Vorraussetzungen ausgegangen.

Welches SDK benutzt du denn?
 

Gucky

Top Contributor
Wenn du eclipse benutzt, ist das sehr einfach. Du öffnest die GUI Klasse einfach mit dem VisualEditor oder mit dem WindowBuilder oder mit was auch immer du eine GUI desingest und dann ist es genau so, wie bei VB. Wenn die Buttons drin sins, dann klickst du mit der rechten Maustaste auf die Buttons und klickst und EventHandling (o. ä.) auf actionPerformed. Dann tust du den Inhalt der ifs von Oben in den dazugehörigen ActionListener. Et Voila.
 

Gucky

Top Contributor
Ja. Den schon eingebauten VisualEditor. :D

Da ist ein Fenster, in dem sind sämtliche Projekte des aktuellen Workspaces aufgelistet. Da navigierst du dann bis zu der oben geposteten Klasse und klickst mit der rechten Maustaste darauf. Unter "open with" wählst du den VisualEditor aus.
 

Debus

Mitglied
Hallo nochmal,

habe nun alles mal mit Buttons fertiggestellt. Die werden auch angezeigt und wenn ich die Drücke wird auch die Variable gefüllt.

Nur malen tut er nicht, da er schon nicht in en Bereich mouseDown geht (habe ich mit einer MessageBox getestet)

Hat da vielleicht einer ne Idee warum das Dingen nun nicht malt?


Java:
package Malen;

import java.awt.BorderLayout;
import java.awt.Point;

import javax.swing.JOptionPane;

import java.awt.*;

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

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.SwingConstants;

public class Freihandzeichner extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7805197233304330435L;
	private JPanel contentPane;
	private String farbe;
	private String art = "FreeHand";
    
	// Variablen
	Point ptA;		
    Point ptB;
    int x,y;
    Image Brick;
    Graphics g;
    int lastx, lasty;
	
	
	
	public void init()	{											// Initialize by adding
   
g = this.getGraphics();
}	
	
	



	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Freihandzeichner frame = new Freihandzeichner();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	

	/**
	 * Create the frame.
	 */
	public Freihandzeichner() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 528, 459);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		
		JButton btnRot = new JButton("Rot");
		btnRot.setBounds(5, 5, 89, 23);
		btnRot.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				farbe = "Red";
				


			}
		});
		contentPane.setLayout(null);
		contentPane.add(btnRot);
		
		JButton btnBlau = new JButton("Blau");
		btnBlau.setBounds(5, 39, 89, 23);
		btnBlau.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				farbe = "Blue";
				

			}
		});
		contentPane.setLayout(null);
		contentPane.add(btnBlau);
		
		JButton btnGrn = new JButton("Gr\u00FCn");
		btnGrn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				farbe = "Green";
				
			}
		});
		btnGrn.setBounds(5, 73, 89, 23);
		contentPane.add(btnGrn);
		
		JButton btnLschen = new JButton("L\u00F6schen");
		btnLschen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				repaint();
			}
		});
		btnLschen.setBounds(5, 343, 89, 23);
		contentPane.add(btnLschen);
		
		JButton btnBeenden = new JButton("Beenden");
		btnBeenden.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			}
		});
		btnBeenden.setBounds(5, 387, 89, 23);
		contentPane.add(btnBeenden);
	}

	public boolean action(Event e, Object arg)
	{
          if(e.target instanceof JButton)
          {
            repaint();
          }
	  return true;
	}

    public boolean mouseDown(Event e, int x, int y)
    {
    	

	  ptA = new Point(x,y);

       if(farbe == "Red")       // If Red selected change color to red.
       {
          g.setColor(Color.red);
       }
       if(farbe == "Green")  // If Green selected change color to green. 
          {
          g.setColor(Color.green);
           }
       if(farbe == "Blue")  // If Blue selected change color to blue.
 		 {
   		  g.setColor(Color.blue);
 		 }
                 if (art == "Square") // If Square selected. 
	            {
                   g.drawRect(x,y,100,100);	// Draw square.
	             }
                  if(art == "Oval")  // If Oval selected. 
	    	     {
                     g.drawOval(x,y,100,100);  // Draw oval.
	    	     }
       
    	return true;
    
    	
    	}
    	
	
	
	
	
   
  /*********************************************************
     Mousedrag Event.Used for FreeHand when drawing inside *
     the applet.                                           
     * @return *
  **********************************************************/
     

        public boolean mouseDrag(Event evt, int x, int y)
        {
        	
        ptB = new Point(x,y);
        
          if(art == "FreeHand")
          {

          		
      
                      g.drawLine(ptA.x, ptA.y, ptB.x, ptB.y);
                      g.drawLine(ptA.x+1, ptA.y+1, ptB.x+1, ptB.y+1);
                 
  		    
                          ptA = ptB;
          }
          return true;
        }
		
		
}

Optional gehört das noch dahinter, aber dann meckert er am Anfang
Java:
      public void paint (Graphics g)
      {
	g.drawImage(Brick,20,40,this);

      }
  }

bei
Java:
Brick = getImage(getDocumentBase(),"brick.gif");

Hat jemand noch eine Idee?

Danke
Holger
 

Gucky

Top Contributor
Was genau meckert er denn?

Das
Code:
g=getGraphics()
funktioniert nicht. Dazu müsstest du die
Code:
paintComponent(Graphics g)
Methode des JFrames überschreiben. Also:
Java:
public void paintComponent(Graphics g){
  this.g=g;
  this.setPreferredSize(WITDH,HEIGHT);//Alternative Schreibweisen möglich
}
Damit wäre auch gleich das überschreiben der
Code:
paint()
-Methode erschlagen. Diese wird nämlich nicht überschrieben, sondern die
Code:
paintComponent()
-Methode

Mit
Code:
this.g=g;
wird die Variable g aus dem Fenster mit der Variablen g aus der Methode gefüllt.
Mit
Code:
this.setPreferredSize(WITDH,HEIGHT);
wird die bevorzugte Größe des bemalbaren Bereiches auf die Größe des Fensters festgelegt. Sonst wird gar nichts gemalt.

mouseDown() wird nirgends aufgerufen, da kein MouseListener im JFrame vorhanden ist. Das geht mit der rechten Maustaste auf das JContentPane und dann genau so, wie bei den Buttons mit dem ActionPerformed nur halt für MouseClicked.
Das Programm stoppt nachdem es den Konstruktor abgelaufen hat einfach, da nichts aus dem Konstruktor aufgerufen wird.

Der String art wird für immer FreeHand bleiben, da er nirgends irgendwas anderes zugewiesen bekommt. Und ganz wichtig: Strings werden mit
Code:
.equals(String)
verglichen. Da Strings nichts anderes sind, als Objekte, wird mit "==" nachgeprüft, ob der linke String auf DIESELBE SPEICHERADRESSE zeigt, wie der rechte.


Ist der Code eigentlich vollständig von deiner Tochter oder hat sie den Code bekommen und musste diesen erweitern?
 

Debus

Mitglied
Hey,

nun meckert er bei

setPreferredSize

er sagt .... is noch aplicable for the Argument int, int


und das
Zitat:
mouseDown() wird nirgends aufgerufen, da kein MouseListener im JFrame vorhanden ist. Das geht mit der rechten Maustaste auf das JContentPane und dann genau so, wie bei den Buttons mit dem ActionPerformed nur halt für MouseClicked.
Das Programm stoppt nachdem es den Konstruktor abgelaufen hat einfach, da nichts aus dem Konstruktor aufgerufen wird.

verstehe ich noch nicht ganz.

Holger


Sorry,

Nein ich versuche den Code hinzubekommen, denn wie gesagt Sie hat das Fach nur mündlich und nur noch bis nach Weihnachten
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Ok. Dann mache ich mich mal an deine Fragen:

Bei setPreferredSize() habe ich einen Fehler gemacht. Sorry. Das muss heißen: this.setPreferredSize(new Dimension(WITDH,HEIGHT));

Die Methode mouseDown ist sozusagen toter Code, da sie nirgends aufgerufen wird. Zumindest habe ich das nie gefunden. Setz mal statt "public" "private" wahrscheinlich wird er meckern.
Um auf MouseEvents zu reagieren, musst du einen MouseListener implementieren. Das geht, indem du auf dein JContentPane mit der rechten Maustaste im Visual Fenster klickst und dann unter EventHandling auf MouseClicked gehst. Der Rest ist so, wie bei den Buttons. In den MouseClickedListener musst du dann den Aufruf der MouseDown()Methode schreiben.
 

Debus

Mitglied
Du bist mein Held,

kann es aber erst morgen testen, da ich nun nur nochmal auf einem IPad geschaut habe und erst morgen wieder im Büro bin, da wir gerade besuch habe, auch wenn es mich "juckt"

Danke
Holger


ps. bis Morgen auf jeden Fall mit einer Rückmeldung
 

Debus

Mitglied
Sorry es juckt sehr,

Kannst Du mir sagen wo ich auf JContentPane klicken muss ich finde es nicht

Danke

Du hast auf jeden Fall schon was gut, aber darüber reden wir noch

Holger
 

Anhänge

  • 1.JPG
    1.JPG
    103,5 KB · Aufrufe: 18
Zuletzt bearbeitet:

Gucky

Top Contributor
Das Gefühl kenne ich gut :D also kein Problem

Du gehst in das Fenster, in dem du die GUI Elemente hin und herziehen kannst. Da klickst du mit der rechten Maustaste auf das JContentPane (also einfach auf eine freie Fläche deines JFrames). Dann geht ein Kontextmenü auf. Unter EventHandling gehst du auf MouseEvent o.ä. Dann wählst du den MouseClicked Listener aus und implementierst diesen. Das dürfte nicht viel anders sein, als bei den Buttons mit dem ActionPerformed Listenerr.
 
Zuletzt bearbeitet:

Debus

Mitglied
Hallo,

habe das MouseClick eingefügt, aber wie rufe ich nun die Methode MouseDown auf?

Java:
	public Freihandzeichner() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 528, 459);
		contentPane = new JPanel();
		contentPane.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				mouseDown();
				
			}
		});
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);

Holger
 

Gucky

Top Contributor
MouseDown erwartet mehrere Argumente. Zum Beispiel ein Event. Die musst du dann übergeben. Ich weiß nicht, wie das bei deinen Programmiersprachen ist aber hier werden die Argumente in den Klammern übergeben.
 

Debus

Mitglied
Ich mache es so aber es kommen Fehlermeldungen

Java:
Freihandzeichner mouse = new Freihandzeichner();
mouse.mouseDown(Event e, init x, init y)

Holger
 
Zuletzt bearbeitet:

Debus

Mitglied
Wenn ich das so mache
Java:
		contentPane.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {

				mouseDown(Event e, init x, init y)

kommen wieder nur Fehlermeldungen.

Ich verstehe den Aufruf nicht, sorry


Holger
 

Debus

Mitglied
So

mouseDown(Event e, init x, init y)

aber so kommen auch wieder Fehler
Die Fehler kommen dann bei den Argumenten in der Klammer


Holger
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Der Aufruf von Methode in Java geht so: nameDerMethode(wertOderVariable,wertOderVariable,wertOderVariable...)

Hast du den Aufruf mithilfe eines System.out.println(String) getestet?
 

Debus

Mitglied
Hey, er geht nun in die Methode mouseDown aber im Eventhandle MousePressed habe ich es aufgerufen.
Das er dahingeht habe ich mit einer MessageBox getestet. Es läuft durch bis Return true

Dann geht er aber nicht weiter in MouseDrag

Wie und wo rufe ich dass denn nun auf, vorallem wo

Holger
 

Gucky

Top Contributor
Für mouseDrag benötigst du wieder einen neuen Listener. Einen MouseDraggeListener. Den fügst du genauso, wie den MousClickedListener hinzu. Da kommt dann der aufruf der Mousedragged Methode rein.
 

Neue Themen


Oben