2016-04-05 7 views
0

Ich mache eine Javafx-Anwendung, die ein begrenztes Rechteck um die Kreise erstellt, die der Benutzer beim ersten Mausklick erstellt. Der Benutzer kann auch einen Kreis mit der sekundären Maustaste entfernen und das umgebende Rechteck sollte entsprechend reagieren und die verbleibenden Kreise als obere und untere Begrenzung verwenden. Das Problem mit meinem Programm ist, dass es nicht funktioniert, wenn ich versuche, mehr als einen Kreis in einer Reihe zu entfernen (es entfernt nur und paßt die Größe für den letzten Kreis)JavaFX entfernt mehr als einen Kreis beim Erstellen eines Begrenzungsrechtecks ​​

import javafx.application.Application; 
import javafx.collections.ObservableList; 
import javafx.event.Event; 
import javafx.geometry.Insets; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseButton; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 
import java.util.ArrayList; 
import java.util.Collections; 

public class BoundRectangle extends Application { 
    double minX, maxX, minY, maxY; 
    Pane pane = new Pane(); 
    Rectangle rectangle; 
    ArrayList<Circle> allCircles = new ArrayList<>(); 

    @Override 
    public void start(Stage primaryStage) { 

     VBox mainBox = new VBox(); 
     Pane mainPane = new Pane(mainBox); 
     mainPane.setPadding(new Insets(10, 10, 10, 10)); 

     pane.getChildren().addAll(mainPane); 
     mainBox.setLayoutX(10); 
     mainBox.setLayoutY(10); 

     pane.setOnMouseClicked(e -> { 
      if (e.getButton() == MouseButton.PRIMARY) { 
        Circle circle = new Circle(e.getX(), e.getY(), 10); 
        allCircles.add(circle); 

        pane.getChildren().add(drawRectangle()); 
        pane.getChildren().add(circle); 
        System.out.println("maxX " + maxX); 
        System.out.println("maxY " + maxY); 
        System.out.println("minX " + minX); 
        System.out.println("minY " + minY); 

       circle.setOnMouseClicked(evt -> { 
        if (evt.getButton() == MouseButton.SECONDARY) { 
          pane.getChildren().remove(circle); 
          allCircles.remove(circle); 
         pane.getChildren().add(drawRectangle()); 

        } 

       }); 

       circle.setStroke(Color.BURLYWOOD); 
       circle.setStrokeWidth(3); 
       circle.setFill(Color.TRANSPARENT); 

      } 
     }); 

     Scene scene = new Scene(pane, 600, 600); 

     primaryStage.setScene(scene); 
     primaryStage.setTitle("click circles, make rectangle"); 
     primaryStage.show(); 
    } 

    public Rectangle drawRectangle() { 
     refresh(); 
     getMinMax(); 

     if (pane.getChildren().size() == 1) 
     { 
      Rectangle rect0 = new Rectangle(0, 0, 0, 0); 
      return rect0; 
     } 

     Rectangle boundingRect = new Rectangle(); 
     boundingRect.setX(minX - 10 - 2); 
     boundingRect.setY(minY - 10 - 2); 
     boundingRect.setWidth(maxX - minX + 2.0 * 10 + 2); 
     boundingRect.setHeight(maxY - minY + 2.0 * 10 + 2); 
     boundingRect.setStroke(Color.BLACK); 
     boundingRect.setStrokeWidth(2); 
     boundingRect.setFill(Color.TRANSPARENT); 

     return boundingRect; 
    } 

    public void getMinMax() { 

     maxY = allCircles.get(0).getCenterY(); 
     minY = allCircles.get(0).getCenterY(); 
     maxX = allCircles.get(0).getCenterX(); 
     minX = allCircles.get(0).getCenterX(); 

     for (Circle c : allCircles) { 
      if (c.getCenterX() < minX) 
       minX = c.getCenterX(); 
      if (c.getCenterX() > maxX) 
       maxX = c.getCenterX(); 
      if (c.getCenterY() < minY) 
       minY = c.getCenterY(); 
      if (c.getCenterY() > maxY) 
       maxY = c.getCenterY(); 
     } 
    } 

    private void refresh() { 
     ObservableList<Node> list = pane.getChildren(); 

     for (Node c : list) { 
      if (c instanceof Rectangle) { 
       pane.getChildren().remove(c); 
       break; 
      } 
     } 
    } 

    public static void main(String[] args) { 
     Application.launch(args); 
    } 
} 

Antwort

0

Der letzte Kreis Sie oben hinzufügen erscheint die das Rechteck; Das Rechteck erscheint jedoch über allen anderen Kreisen. So erhält nur der letzte hinzugefügte Kreis die Mausklicks (Klicks auf andere Kreise sind auf das Rechteck ausgerichtet).

Die schnellste Lösung ist das Rechteck Maus transparent zu machen:

boundingRect.setMouseTransparent(true); 

Eine bessere Lösung insgesamt könnte nur sein, ein Rechteck zu erstellen und aktualisieren ihre x, y, width und height Eigenschaften. Auf diese Weise können Sie einfach sicherstellen, dass das Rechteck einmal hinzugefügt wurde und am unteren Rand des Stapels bleibt.

+0

danke! das hat funktioniert –

Verwandte Themen