2014-01-07 3 views
0

У меня есть несколько объектов на доске, и я бы хотел получить индексы этих объектов по координатам. Я пробовал сделать обработчик MouseEvent и использовать getBoundInParent() в сочетании с MouseInfo.getPointerInfo().getLocation(), но безуспешно. Эти методы дали мне разные координаты и не могли их сопоставить.Javafx - Cursor intersect shape

Должен ли я сделать прямоугольник по координатам курсора и использовать метод getBoundInParent().intersects?

Рекомендации:

ответ

2

Решение

На каждом из форм, обеспечивают setOnMouseEntered и setOnMouseExited обработчиков поймать вхождение мышей и покидающее событие и записать индекс формы, когда мышь над.

Успенской

Я предполагаю, что вы должны пересекаться курсор точки доступа (например, кончик указателя мыши стрелки), а не форма курсора или прямоугольные границы курсора (как пересечение точки доступа является стандартным способом что курсоры работают).

Выход Пример приложения

mouseover

  • При наведении курсора мыши на круг, круг будет выделен и индекс этого круга (1) будет отображаться
  • При наведении курсора мыши на прямоугольнике , прямоугольник будет подсвечен и отобразится индекс прямоугольников (2).
  • Если вы не нажмете ни на одну из фигур, ни одна из них не будет выделена, и индекс не будет отображаться.

Пример кода

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.HBox; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.*; 
import javafx.stage.Stage; 

public class ShapeIntersector extends Application { 
    private static final Shape[] shapes = { 
      new Circle(50, Color.AQUAMARINE), 
      new Rectangle(100, 100, Color.PALEGREEN) 
    }; 

    private static final DropShadow highlight = 
      new DropShadow(20, Color.GOLDENROD); 

    @Override 
    public void start(Stage stage) throws Exception { 
     HBox layout = new HBox(40); 
     layout.setPadding(new Insets(30)); 
     layout.setAlignment(Pos.CENTER); 

     Label highlightedShapeLabel = new Label(" "); 
     highlightedShapeLabel.setStyle(
       "-fx-font-family: monospace; -fx-font-size: 80px; -fx-text-fill: olive" 
     ); 

     for (Shape shape: shapes) { 
      layout.getChildren().add(shape); 

      shape.setOnMouseEntered(new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent event) { 
        shape.setEffect(highlight); 
        int idx = layout.getChildren().indexOf(shape) + 1; 
        highlightedShapeLabel.setText(
          "" + idx 
        ); 
       } 
      }); 

      shape.setOnMouseExited(new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent event) { 
        shape.setEffect(null); 
        highlightedShapeLabel.setText(" "); 
       } 
      }); 
     } 

     layout.getChildren().add(highlightedShapeLabel); 

     stage.setScene(new Scene(layout)); 
     stage.show(); 
    } 

    public static void main(String[] args) { launch(args); } 
} 
+0

Simpler, чем я думал, и это именно то, что мне было нужно. Благодаря ! : D – Adorjan