2016-04-05 13 views
0

Birincil fare tıklatıldığında kullanıcının oluşturduğu çevrelerin etrafında sınırlı bir dikdörtgen oluşturan bir javafx uygulaması yapıyorum. Kullanıcı ayrıca ikincil fare tuşuyla bir çemberi kaldırabilir ve sınırlayıcı dikdörtgen buna uygun şekilde tepki göstermeli ve kalan daireleri üst ve alt sınırları olarak kullanmalıdır. Benim program ile sorun ben üst üste birden fazla daireyi kaldırmak çalıştığınızda o (sadece kaldırır ve son daire için boyutlandırır) eklemek geçen çember üstünde çıkanJavaFX, sınırlayıcı dikdörtgen oluştururken birden fazla daireyi kaldırarak

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); 
    } 
} 

cevap

0

çalışmıyor olmasıdır dikdörtgen; ancak dikdörtgen diğer tüm dairelerin üstünde görünür. Bu yüzden sadece eklenen son çember fare tıklamalarını elde edecektir (diğer dairelere yapılan tıklamalar dikdörtgene hedeflenmiştir).

boundingRect.setMouseTransparent(true); 

Daha iyi bir çözüm genel olarak sadece kendi x, y, width ve height özelliklerini tek dikdörtgen oluşturmak ve güncellemek için olabilir:

hızlı düzeltme şeffaf dikdörtgen fare yapmaktır. Bu sayede dikdörtgenin bir kez eklendiğinden ve yığının altında kaldığından emin olabilirsiniz.

+0

Teşekkürler! işe yaradı –

İlgili konular