Verbindung von Zwei Kreisen löschen !

Playermagier

Mitglied
Hallo Leute,
mein Problem besteht darin, dass ich eine Verbindung zwischen zwei Kreisen löschen möchte. Dies soll der untere Code durchführen.
Java:
paneCircles.getChildren().remove(path);
Desweiteren wird unten wichtige Code abschnitte gezeigt was vll relevant sein kein.

Java:
public void kreiseVerbinden(Kreis letzterKreis, Kreis vorletzterKreis) {
       Line path = new Line(letzterKreis.getCenterX(), letzterKreis.getCenterY(), vorletzterKreis.getCenterX(), vorletzterKreis.getCenterY());
       path.setStrokeWidth(5.);
       path.setStroke(Color.BLACK);
       paneCircles.getChildren().add(path);
       // Zahlenkreise auf den Linien zeichnen
       // Zuerst alle entfernen, dann alle hinzufuegen
       paneCircles.getChildren().removeAll(kreise);
       paneCircles.getChildren().addAll(kreise);
       
   }
paneCircles.getChildren().addAll(zahlen);

Java:
public void kanteLoeschen(Line path, Kreis letzterKreis, Kreis vorletzterKreis)
       {
           if (letzterKreis.getColor().equals(vorletzterKreis.getColor()))
           {
               System.out.println("Lösche dich doch du line");
               paneCircles.getChildren().remove(path);
               letzterKreis.verringerKantenanzahl();
               vorletzterKreis.verringerKantenanzahl();
           }
       }
 
Ein Kreis/Linie wird gelöscht, indem er nicht gezeichnet wird. 😀
Wir können das natürlich nur beurteilen, wenn du dein komplettes Programm postest - insofern möglich.
 
Hier der Vollständiger Code:
Java:
package application.view;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import javax.swing.plaf.synth.SynthOptionPaneUI;
import javafx.event.ActionEvent;
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.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;

public class Handlungsreisender_Controller {
   /* fx-Komponenten */
   @FXML private Button neuesProblemButton;
   @FXML private Button loesungVergleichenButton;
   @FXML private Button loesungAnzeigenButton;
   @FXML private Menu programmMenu;
   @FXML private MenuItem neuesProblemMenuItem;
   @FXML private MenuItem beendenMenuItem;
   @FXML private Menu hilfeMenu;
   @FXML private MenuItem zielMenuItem;
   @FXML private MenuItem ueberMenuItem;
   @FXML private AnchorPane paneCircles;

   // Zahlenkreise, die auf der Oberfläche gezeichnet werden
   static final double RADIUS = 15;   // Radius eines Zahlenkreises
   // Liste mit Kreisen, die gezeichnet werden
   private List<Kreis> kreise = new ArrayList<Kreis>();
   private Kreis letzterKreis = null;
   private Kreis vorletzterKreis = null;

   private 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)
       {
           System.out.println("Kackvogel");
           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();
           //zahlen.clear();
           letzterKreis = null;
           KnotenAnzahlAendern();

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


   /**
    * Durchs Klicken sollen die Kreise in der Reihenfolge verbunden werden
    * @param event
    */
   @FXML
   public void handleMouseClicked(MouseEvent event) {
       for(Kreis kreis:kreise){

           if(kreis.isClicked(event.getX(), event.getY())){
               vorletzterKreis = letzterKreis;
               letzterKreis = kreis;
               kreis.erhoeheCN();
               System.out.println(kreis.klickanzahl);

               if(kreis.klickanzahl == 1 )
               {
                   kreis.setFill(Color.BLUE);
                   kreis.setFarbe(Color.BLUE);
                           if(vorletzterKreis != null )
                           {
                               System.out.println("kurz vor concet");
                               kreiseVerbinden(vorletzterKreis, letzterKreis);
                               if( (vorletzterKreis.getKantenanzahl() < 2) && (letzterKreis.getKantenanzahl() < 2))
                               {
                                   vorletzterKreis.erhoeheKN();
                                   letzterKreis.erhoeheKN();
                               }
                           }
                   break;
               }
               else {
                   kreis.klickanzahl = kreis.klickanzahl - 2;
                   kreis.setFill(Color.GREEN);
                   System.out.println(kreis.klickanzahl);
                   kreis.kanteLoeschen(kreis.path, letzterKreis, vorletzterKreis);
               }
               break;

           }
      }
}
   /**
    *  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);
           kreise.add(kreis);
       }
       // Kreise auf die Pane platzieren
       paneCircles.getChildren().addAll(kreise);
  
   }

   /**
    * Eine zufaellige und zulaessige Position eines Kreises wird zugewiesen
    * @param Koordinaten, an die die Position uebergeben wird
    */
   private 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);
   }

   /**
    * Innere Klasse zur Darstellung der Kreise mit Zahlen
    * Sie erweitert die Klasse Circle (Shape)
    */
   private class Kreis extends Circle{
       Line path;
       private Color farbe;
       private int klickanzahl=0;
       private int kantenanzahl =0;
       public Kreis ( double xpos, double ypos, int CN , int KN, Color f){
           // Von Superklasse Circle geerbt
           this.setCenterX(xpos);
           this.setCenterY(ypos);
           this.setRadius(RADIUS);
           this.setFill(Color.GREEN);
           farbe = f;
           klickanzahl = CN;
           kantenanzahl = KN;
       }
       public Color setFarbe(Color Farbe) {
           return farbe = Farbe;
       }

       public Color getColor(){
           return farbe;
       }
        void erhoeheCN()
        {
            klickanzahl = klickanzahl + 1;
        }

        void erhoeheKN(){
            kantenanzahl = kantenanzahl + 1;
        }
      
        void verringerKantenanzahl()
        {
            kantenanzahl = kantenanzahl -1;
        }
      
        public int getKlickanzahl()
        {
               return klickanzahl;
        }
      
        public int getKantenanzahl()
        {
               return kantenanzahl;
        }
      
        void setPath(Line Lpath){
            path = Lpath;
        }
      
        public Line getPath()
        {
               return path;
        }
      
       // 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;
       }
      
       public void kanteLoeschen(Line path, Kreis letzterKreis, Kreis vorletzterKreis)
       {
           if (letzterKreis.getColor().equals(vorletzterKreis.getColor()))
           {
               System.out.println("Lösche dich doch du line");
               paneCircles.getChildren().remove(path);
               letzterKreis.verringerKantenanzahl();
               vorletzterKreis.verringerKantenanzahl();
           }
          
       }
      
   }
   /**
    * Der zuletzt (richtig) angeklickte Kreis soll mit dem letzten verbunden werden
    * @param letzter Kreis
    * @param neuer Kreis
    */
   public void kreiseVerbinden(Kreis letzterKreis, Kreis vorletzterKreis) {
       Line path = new Line(letzterKreis.getCenterX(), letzterKreis.getCenterY(), vorletzterKreis.getCenterX(), vorletzterKreis.getCenterY());
       path.setStrokeWidth(5.);
       path.setStroke(Color.BLACK);
       paneCircles.getChildren().add(path);
      
       // Zuerst alle entfernen, dann alle hinzufuegen
       paneCircles.getChildren().removeAll(kreise);
       paneCircles.getChildren().addAll(kreise); 
   }
}
 
Du rufst an keiner Stelle die setPath-methode von deiner Kreisklasse auf. Deshalb sollte path bei allen Kreisinstanzen null sein, und paneCircles.getChildren().remove(path) ist gleichbedeutend mit paneCircles.getChildren().remove(null).
 

Neue Themen


Zurück
Oben