setOnMouseClicked

Playermagier

Mitglied
Hallo Leute,
ich möchte eine Methode 'setOnMouseClicked' im Konstruktor aufrufen. Wenn ich auf das Objekt klicke soll es z.B gelöscht werden oder die Farbe ändern.
Java:
import javafx.event.EventHandler;
import javafx.scene.input.MouseEvent;
Java:
public Kante (Kreis kreis1 ,Kreis kreis2)
   {
       _kreis1=kreis1;
       _kreis2=kreis2;
       x1 = _kreis1.getCenterX();
       x2 = _kreis2.getCenterX();
       y1 = _kreis1.getCenterY();
       y2 = _kreis2.getCenterY();
       
        Kante.setOnMouseClicked(new EventHandler<MouseEvent>()
          {
               @Override
               public void handle(MouseEvent t) {
                   kanteloeschen(kreis1, kreis2);
               }
           });
   }

Könnt ihr mir weiterhelfen?
Gruß
 

Playermagier

Mitglied
oh sorry da fehlte noch was :-( bekomme bei der Implemetierung folgende fehlermeldung:
Cannot make a static reference to the non-static method setOnMouseClicked(EventHandler<? super MouseEvent>) from the type Node

The method kanteloeschen(Handlungsreisender_1_Controller.Kreis, Handlungsreisender_1_Controller.Kreis) is undefined for the type new EventHandler<MouseEvent>(){}
 

VfL_Freak

Top Contributor
Moin,

Cannot make a static reference to the non-static method setOnMouseClicked(EventHandler<? super MouseEvent>) from the type Node
auf Deutsch: Du kannst nicht statisch auf ein nicht-statisches Objekt zugreifen !!

The method kanteloeschen(Handlungsreisender_1_Controller.Kreis, Handlungsreisender_1_Controller.Kreis) is undefined for the type new EventHandler<MouseEvent>(){}
Scheinbar existiert keine Methode 'kanteloeschen' mit der von Dir verwendeten Signatur!!

Poste mal mehr Code !!

Gruß Klaus
 

Playermagier

Mitglied
Java:
package application.model;
import javafx.event.EventHandler;
import javafx.scene.input.MouseEvent;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Path;
import application.model.Kante;
import application.view.Handlungsreisender_1_Controller.Kreis;
public class Kante extends Path {
   public Kreis _kreis1;
   public Kreis _kreis2;
   public int pathNummer =0;
   public double steigung;
   public double abstand;
 
   public Kante (Kreis kreis1 ,Kreis kreis2)
   {
       _kreis1=kreis1;
       _kreis2=kreis2;
       x1 = _kreis1.getCenterX();
       x2 = _kreis2.getCenterX();
       y1 = _kreis1.getCenterY();
       y2 = _kreis2.getCenterY();
     
        Kante.setOnMouseClicked(new EventHandler<MouseEvent>()
          {
               @Override
               public void handle(MouseEvent t) {
                   Kante linie1.kanteloeschen(kreis1, kreis2);
               }
           });
   }
 
   public double x1 ;
   public double x2 ;
   public double y1 ;
   public double y2 ;
   // Wurde der Kreis getroffen?
 
   public double deltaX;
   public double deltaY;
   //geraden gleichung y=mx+q
   public double m;
   public double q;
   //Linendicke/tolleranz
   public double dicke;
   public double tol;
 
 
public void AbstandBerechnen()
{
   deltaX = x1 - x2;
   deltaY = y1 - y2;
   m = deltaY / deltaX;
 
   q = y1 - m * x1;
 
   abstand = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
}

public boolean isClickedKante(double x, double y)
{
   return (x*m+q+dicke+tol<=y) && (x*m+q-dicke-tol>=y);
}

}



Java:
package application.view;
import javafx.scene.input.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import application.model.Kante;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar.ButtonData;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextInputDialog;
import javafx.scene.effect.Light.Point;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;

public class Handlungsreisender_1_Controller   {
 
   /*public Handlungsreisender_1_Controller(double xpos, double ypos, int CN, int KN, Color f, int Kreisanzahl) {
       super(xpos, ypos, CN, KN, f, Kreisanzahl);
       // TODO Auto-generated constructor stub
   }*/
 
   /* fx-Komponenten */
   @FXML protected Button NeuesProblemButton;
   @FXML protected Button loesungVergleichenButton;
   @FXML protected Button loesungAnzeigenButton;
   @FXML protected Menu programmMenu;
   @FXML protected MenuItem neuesProblemMenuItem;
   @FXML protected MenuItem beendenMenuItem;
   @FXML protected Menu hilfeMenu;
   @FXML protected MenuItem zielMenuItem;
   @FXML protected MenuItem ueberMenueItem;
   @FXML protected AnchorPane paneCircles;

   // Zahlenkreise, die auf der Oberfläche gezeichnet werden
   static final double RADIUS = 15;   // Radius eines Zahlenkreises
   // Liste mit Kreisen, die gezeichnet werden
   public List<Kreis> kreise = new ArrayList<Kreis>();
   public List<Kante> liste = new ArrayList<Kante>();
   protected Kreis letzterKreis = null;
   protected Kreis vorletzterKreis = null;
   protected Kreis vorVorletzterKreis = null;
   public static int Kreisnummer = 0;
   protected boolean start = true;

   public int anzahlKnoten;

   /**
    * Alert-Fenster mit Spielhinweis und Angabe von Knoten
    */
   public void neuesProblem() {
   TextInputDialog dialog = new TextInputDialog("");
   dialog.setTitle ("Neues Problem");
   dialog.setHeaderText("Spielhinweis: Grüner Punkt ist Start- und Zielknoten.");
   dialog.setContentText("Wieviele Knoten möchten Sie verbinden?");

   Optional<String> result = dialog.showAndWait();
   result.ifPresent(anzahlKnoten -> System.out.println("Anzahl der Knoten " + anzahlKnoten));

   anzahlKnoten = Integer.parseInt(result.get());
   }
   public void KnotenAnzahlAendern()
   {
       Alert alert = new Alert(AlertType.CONFIRMATION);
       alert.setTitle("Auswahl von Anzahl der Knoten");
       alert.setContentText("Möchten Sie die Anzahl der Knoten ändern?");

       ButtonType buttonTypeJa = new ButtonType("Ja");
       //ButtonType buttonTypeNein = new ButtonType("Nein",ButtonData.CANCEL_CLOSE);

       Optional<ButtonType> result = alert.showAndWait();

       if(result.get() == buttonTypeJa)
       {
           neuesProblem();
       }
   }

   /**
    * Handler für neuesProblemButton:
    * Die Kreise verschwinden
    * @param event
    */
   @FXML
   public void handleNeuesProblemButton(ActionEvent event) {
       paneCircles.setDisable(false);   // die Zeichenfläche wird (wieder) aktiv

       // Kreise neu generieren und platzieren
       if(start){
           start = false;
           neuesProblem();
       }
       else{
           kreise.clear();
           letzterKreis = null;
           //KnotenAnzahlAendern();

       // da nur die Kreise der Pane gehören, können wir alle Elemente entfernen
       paneCircles.getChildren().removeAll(paneCircles.getChildren());
       }
       kreiseZeichnen();
   }

 

   /**
    * Durchs Klicken sollen die Kreise in der Reihenfolge verbunden werden
    * @param event
    */
   @FXML
   public void handleMouseClicked(MouseEvent event)
   {
       //int anzahl_klicks = 0;
       // Anzahl der Klicks pro Knoten sollen gemerkt werden
       for(Kreis kreis:kreise)
       {
           if(kreis.isClicked(event.getX(), event.getY()))
           {
               vorVorletzterKreis = vorletzterKreis;
               vorletzterKreis = letzterKreis;
               letzterKreis = kreis;
               letzterKreis.setKreisnummer(Kreisnummer = Kreisnummer +1);
               kreis.erhoeheCN();
               System.out.println("Klickanzahl" + kreis.getKlickanzahl());

               if(kreis.getKlickanzahl() == 1 )
               {
                   System.out.println("blububuubub");
                   kreis.setFill(Color.BLUE);
                   kreis.setFarbe(Color.BLUE);
                 
                   if( vorletzterKreis != null )
                   {
                       kreiseVerbinden(vorletzterKreis, letzterKreis);
                       if( (vorletzterKreis.getKantenanzahl() < 2) && (letzterKreis.getKantenanzahl() < 2))
                       {
                           vorletzterKreis.erhoeheKN();
                           letzterKreis.erhoeheKN();
                       }
                   }
                   break;
               }
               /*else if(anzahlKnoten == letzterKreis.getKreisnummer() && letzterKreis.getFarbe().equals(vorletzterKreis.getFarbe()))
               {
                   System.out.println("verbunden");
                   kreiseVerbinden(letzterKreis, vorletzterKreis);
               }*/
               else
               {
                    kreis.clearKlickanzahl()  ;
                   //kreis.verringerKantenanzahlUm2());
                   kreis.setFill(Color.GREEN);
                   System.out.println(kreis.getKlickanzahl());
                   kanteLoeschen(kreis.getPath(), letzterKreis, vorletzterKreis);
               }
               break;
           } // if END
           /*if(Kante.isClickedKante(event.getX(), event.getY(), Line path )){
               continue;
           }*/
       } // For END
   }   // handleMouseClicked
 
   public void kanteLoeschen(Line path, Kreis letzterKreis, Kreis vorletzterKreis)
   {
       if (letzterKreis.getFarbe().equals(vorletzterKreis.getFarbe()) )
       {
           System.out.println("Lösche dich doch du line");
           paneCircles.getChildren().remove(path);
           letzterKreis.verringerKantenanzahl();
           vorletzterKreis.verringerKantenanzahl();
       }
 
   }
 
   /**
    * Eine zufaellige und zulaessige Position eines Kreises wird zugewiesen
    * @param Koordinaten, an die die Position uebergeben wird
    */
   public void positionZuweisen(Point koord)
   {
       double x = (int) (Math.random() * (paneCircles.getPrefWidth() - 2*RADIUS -10) + RADIUS +5);
       double y = (int) (Math.random() * (paneCircles.getPrefHeight() - 2*RADIUS -10) + RADIUS +5);
       // pruefe, ob sich Kreise nicht ueberlappen, sonst neue Position
       boolean newPosition = false;
       while( !newPosition )
       {
        boolean newCheck = false;
        for(Kreis kreis: kreise)
        {
          if( Math.abs(kreis.getCenterX() - x) < 40 && Math.abs(kreis.getCenterY() - y) < 40 )
          {
           if( Math.abs(kreis.getCenterX() - x) < 40 )
             x = (int) (Math.random() * (paneCircles.getPrefWidth() - 2 * RADIUS) + RADIUS);
           else
             y = (int) (Math.random() * (paneCircles.getPrefHeight() - 2 * RADIUS) + RADIUS);
             newCheck = true;
             break;
           }
         }
           newPosition = !newCheck;
       }
       // Wenn die Schleife beendet ist, gibt es eine zulaessige Position
       koord.setX(x);
       koord.setY(y);
   }
 
   /**
    *  platziere Kreise mit Zahlen
    */
    void kreiseZeichnen()
   {
       for(int i = 1; i <= anzahlKnoten; i++)
       {
           // Mittel des Kreises
           Point koord = new Point();
           positionZuweisen(koord);
           Kreis kreis = new Kreis( koord.getX(), koord.getY(), 0, 0, Color.GREEN, 0);
          /* kreis.setOn.setOnMouseClicked(new EventHandler<MouseEvent>() {
               public void handle(MouseEvent e) { 
               }
           });*/
           kreise.add(kreis);
       }
       // Kreise und Zahlen auf die Pane platzieren
       paneCircles.getChildren().addAll(kreise);
       //paneCircles.getChildren().addAll(zahlen);
   }

   /**
    * Der zuletzt (richtig) angeklickte Kreis soll mit dem letzten verbunden werden
    * @param letzter Kreis
    * @param neuer Kreis
    */
   public void kreiseVerbinden(Kreis letzterKreis, Kreis vorletzterKreis)
    {
       if(letzterKreis.getKantenanzahl() < 2 && vorletzterKreis.getKantenanzahl() < 2 && letzterKreis.getKlickanzahl() == 1 && vorletzterKreis.getKlickanzahl() == 1)
       {
           Line path = new Line(letzterKreis.getCenterX(), letzterKreis.getCenterY(), vorletzterKreis.getCenterX(), vorletzterKreis.getCenterY());
           //Kante kant = new Kante(letzterKreis,vorletzterKreis);
           path.setStrokeWidth(5.);
           path.setStroke(Color.BLACK);
           letzterKreis.setPath(path);
           vorletzterKreis.setPath(path);
           paneCircles.getChildren().add(path);
       }
     
       // kreise auf den Linien zeichnen
       // Zuerst alle entfernen, dann alle hinzufuegen
       //paneCircles.getChildren().removeAll(kreise);
       paneCircles.getChildren().removeAll(kreise);
       paneCircles.getChildren().addAll(kreise);
   }
 
   public Kreis getLetzterKreis(){
       return letzterKreis;
   }
   public Kreis getVorLetzterKreis(){
       return vorletzterKreis;
   }
 
   /**
    * Innere Klasse zur Darstellung der Kreise mit Zahlen
    * Sie erweitert die Klasse Circle (Shape)
    */
   public class Kreis extends Circle {
       static final double RADIUS = 15;
       int kreisnummer = 0;
       protected Line path;
       protected  Color farbe;
       protected  int klickanzahl=0;
       protected int kantenanzahl =0;
     
     
       //private boolean klicked = false;
       public Kreis ( double xpos, double ypos, int CN , int KN, Color f, int Kreisanzahl){
           // Von Superklasse Circle geerbt
           this.setCenterX(xpos);
           this.setCenterY(ypos);
           this.setRadius(RADIUS);
           this.setFill(Color.GREEN);
           farbe = f;
           klickanzahl = CN;
           kantenanzahl = KN;
           kreisnummer = Kreisanzahl;
           /*  Kreis.setOnMouseClicked(new EventHandler<MouseEvent>()
              {
                   @Override
                   public void handle(MouseEvent t) {
                       Kreis.setFarbe(Color.RED);
                   }
               });*/
         
       }
     
       public Color setFarbe(Color Farbe) {
           return farbe = Farbe;
       }

       public Color getFarbe(){
           return farbe;
       }
     
       public void setKreisnummer(int nr)
       {
           kreisnummer =nr;
       }
     
       public int getKreisnummer()
       {
           return kreisnummer;
       }
     
       public void erhoeheCN()
        {
            klickanzahl = klickanzahl + 1;
        }

       public void erhoeheKN(){
            kantenanzahl = kantenanzahl + 1;
        }
     
       public void verringerKantenanzahl()
        {
            kantenanzahl = kantenanzahl -1;
        }
     
       public void verringerKantenanzahlUm2()
        {
            kantenanzahl = kantenanzahl -2;
        }
     
        public int getKlickanzahl()
        {
               return klickanzahl;
        }
     
        public int getKantenanzahl()
        {
               return kantenanzahl;
        }
     
        public void setKlickanzahl(int  anzahl)
        {
                klickanzahl=anzahl;
        }
     
        public void setPath(Line Lpath){
            path = Lpath;
        }
     
        public Line getPath()
        {
               return path;
        }
     
        public void clearKlickanzahl()
        {
            klickanzahl=0;
        }
     
       // Wurde der Kreis getroffen?
       public  boolean isClicked(double x, double y)
       {
           return Math.abs(x - this.getCenterX()) < RADIUS + 5. && Math.abs(y - this.getCenterY()) < RADIUS + 5;
       }

   }



 
}
 
Zuletzt bearbeitet von einem Moderator:

VfL_Freak

Top Contributor
Bitte nicht einfach nur Code hinklatschen ... :mad:

Aber wenn Du ihn mal anschauen würdest, dann würde Dir genau DAS auffallen, was ich oben schrieb:
Scheinbar existiert keine Methode 'kanteloeschen' mit der von Dir verwendeten Signatur!!

Die Signatur:
Java:
public void kanteLoeschen( Line path, Kreis letzterKreis, Kreis vorletzterKreis )
Dein Aufruf:
Java:
kanteloeschen( kreis1, kreis2 );

Fällt Dir was auf ?? :rolleyes:

Gruß Klaus
 

Playermagier

Mitglied
neee sorry aber habe allgemein das problem, das er da Meckert

Java:
Kreis.setOnMouseClicked(new EventHandler<MouseEvent>()
              {
                   @Override
                   public void handle(MouseEvent t) {
                       Kreis.setFarbe(Color.RED);
                   }
               });

muss ich mein Objekt Static machen oder was ?
 

Playermagier

Mitglied
Problem gelöst ohne kreis.set........ sondern nur setOnMouseClicked...... das die Methode schon weiss aufwelches Objekt er sich beziehen muss. Was mir noch nicht klar ist wie ich jetzt die Kante löschen kann?
Kreise werden ja so verbunden :
Java:
public void kreiseVerbinden(Kreis letzterKreis, Kreis vorletzterKreis)
    {
       if(letzterKreis.getKantenanzahl() < 2 && vorletzterKreis.getKantenanzahl() < 2 && letzterKreis.getKlickanzahl() == 1 && vorletzterKreis.getKlickanzahl() == 1)
       {
           Line path = new Line(letzterKreis.getCenterX(), letzterKreis.getCenterY(), vorletzterKreis.getCenterX(), vorletzterKreis.getCenterY());
           Kante kant = new Kante(letzterKreis,vorletzterKreis);
           path.setStrokeWidth(5.);
           path.setStroke(Color.BLACK);
           letzterKreis.setPath(path);
           vorletzterKreis.setPath(path);
           paneCircles.getChildren().add(path);
       }
       // kreise auf den Linien zeichnen
       // Zuerst alle entfernen, dann alle hinzufuegen
       //paneCircles.getChildren().removeAll(kreise);
       paneCircles.getChildren().removeAll(kreise);
       paneCircles.getChildren().addAll(kreise);
   }

für Kante Löschen hatte ich sowas gehabt :

Java:
public void kanteLoeschen(Line path, Kreis letzterKreis, Kreis vorletzterKreis)
   {
       //if (letzterKreis.getFarbe().equals(vorletzterKreis.getFarbe()) )
       //{
           System.out.println("Lösche dich doch du line");
           paneCircles.getChildren().remove(path);
           letzterKreis.verringerKantenanzahl();
           vorletzterKreis.verringerKantenanzahl();
       //}
   }

möchte es ja so machen wenn ich auf das Objekt klicke das er sich Löscht des wegen verushce ich es ja mit setOnMouseClicked hmm
 

Playermagier

Mitglied
Hallo , liebe community ich habe mir was neues überlegt.
Ich übergebe bei der Methode kreiseVerbinden(...) meiner Klasse Kante die zwei Kreise und initalisiere im Konstruktor in der Kante den path.
Habe Folgende Ausgaben:
Line[startX=24.0, startY=57.0, endX=48.0, endY=159.0, stroke=0x000000ff, strokeWidth=5.0]
Line[startX=0.0, startY=0.0, endX=0.0, endY=0.0, stroke=0x000000ff, strokeWidth=1.0]
Line[startX=0.0, startY=0.0, endX=0.0, endY=0.0, stroke=0x000000ff, strokeWidth=1.0]

Laut der Ausgabe haben haben meine Kreise nicht den Path erhalten !
jemand eine Idee ?
Java:
    public List<Kreis> kreise = new ArrayList<Kreis>();
   public List<Kante> line = new ArrayList<Kante>();
   public Kreis letzterKreis = null;
   public Kreis vorletzterKreis = null;
   public Kreis vorVorletzterKreis = null;
public void kreiseVerbinden(Kreis vorletzterKreis , Kreis letzterKreis )
    {
       if(letzterKreis.getKantenanzahl() < 2 && vorletzterKreis.getKantenanzahl() < 2 && letzterKreis.getKlickanzahl() == 1 && vorletzterKreis.getKlickanzahl() == 1)
       {
           Kante line_1 = new Kante(letzterKreis,vorletzterKreis);
           letzterKreis.setPath(line_1);
           vorletzterKreis.setPath(line_1);
           paneCircles.getChildren().add(line_1);
           line.add(line_1);
           System.out.println(line_1.path);
           System.out.println(letzterKreis.getPath());
           System.out.println(vorletzterKreis.getPath());
       }else{
       // kreise auf den Linien zeichnen
       // Zuerst alle entfernen, dann alle hinzufuegen
       paneCircles.getChildren().removeAll(kreise);
       paneCircles.getChildren().addAll(kreise);
       paneCircles.getChildren().removeAll(line);
       paneCircles.getChildren().addAll(line);
       }
   }


public class Kante extends Line
{
   public Kante  kante;
   public Kreis _kreis1;
   public Kreis _kreis2;
   public Line path;
   public int pathNummer =0;
   public double steigung;
   public double abstand;
  
   public Kante (Kreis kreis1 ,Kreis kreis2)
   {
       _kreis1=kreis1;
       _kreis2=kreis2;
       Line path = new Line(kreis1.getCenterX(), kreis1.getCenterY(), kreis2.getCenterX(), kreis2.getCenterY());
       this.path = path;

       path.setStrokeWidth(5.);
       path.setStroke(Color.BLACK);
      
       x1 = _kreis1.getCenterX();
       x2 = _kreis2.getCenterX();
       y1 = _kreis1.getCenterY();
       y2 = _kreis2.getCenterY();
      
        setOnMouseClicked(new EventHandler<MouseEvent>()
          {
               @Override
               public void handle(MouseEvent t) {
                   System.out.println("Korunannanananna");
                   //kanteLoeschen( path, kreis1, kreis1);
                  
               }
           });
   }
  
   public double x1 ;
   public double x2 ;
   public double y1 ;
   public double y2 ;
   // Wurde der Kreis getroffen?
  
   public double deltaX;
   public double deltaY;
   //geraden gleichung y=mx+q
   public double m;
   public double q;
   //Linendicke/tolleranz
   public double dicke;
   public double tol;
  
  
   public void setLine(Line path)
   {
       path = path;
   }
  
  
   public  Line getLine()
   {
       return path;
   }
  
   public void AbstandBerechnen()
   {
       deltaX = x1 - x2;
       deltaY = y1 - y2;
       m = deltaY / deltaX;
       q = y1 - m * x1;
       abstand = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
   }
  
   public boolean isClickedKante(double x, double y)
   {  
       return (x*m+q+dicke+tol<=y) && (x*m+q-dicke-tol>=y);
   }
}
 

Neue Themen


Oben