2016-12-29 12 views
0

현재 클릭 한 위치와 터미널에 인쇄 된 좌표 사이에는 연결이 끊어집니다. 그것은 중앙 GridPane의 좌표를 기반으로하지만 imageView의 이미지 자체는 아닙니다.JavaFX Gridpane에서 크기가 조정 된 ImageView를 클릭하는 좌표를 얻는 방법

이전에는이 ​​응용 프로그램에서 이미지의 크기를 조정하지 않고 자동화 된 포토샵 프로세스에서 클릭/좌표가 동기화됩니다. 내가 여기에 GridPane

//Makes imageView arraylist from all images in a given directory 
    private ArrayList<ImageView> makeImageViewArr(File imagesDir) { 

     //transer file names from directory folder to string array 
     File[] strImageList = imagesDir.listFiles(); 
     myMouseHandler mouseHandler = new myMouseHandler(); 

     //instantiate imageview arraylist 
     arrImageList = new ArrayList<ImageView>(); 

     //get files from folder & start at 1 to ignore ds.Store 
     for(int count = 1; count < strImageList.length; count++) { 
     ImageView imgView = 
     new ImageView(strImageList[count].toURI().toString()); 

     imgView.setFitHeight(360); 
     imgView.setFitWidth(640); 
     imgView.setPreserveRatio(true); 
     imgView.setSmooth(true); 
     imgView.setOnMouseClicked(mouseHandler); 
     arrImageList.add(imgView); 
     } 

     return arrImageList; 
    }//END METHOD 

에 표시되는 크기가 조정 된 이미지의 ArrayList에 내가 단순히

//inner class for mouse input 
    public class myMouseHandler implements EventHandler<MouseEvent> 
    { 
     /* Method which handles & executes mouse clicks 
     * 
     * @param e KeyEvent the code from the mouse click 
     * 
     * returns none 
     */ 
     @Override 
     public void handle(MouseEvent e) 
     { 
      //reset image to erase previous box 
      pane.setCenter(arrImageList.get(index)); 

      //get image that was clicked on and pixel reader from image 
      Image clickedImg = arrImageList.get(index).getImage(); 
      PixelReader pxlRdr = clickedImg.getPixelReader(); 

      //get image height/width for copy 
      int clickedImgW = (int) clickedImg.getWidth(); 
      int clickedImgH = (int) clickedImg.getHeight(); 

      //get x and y coordinates from click 
      int xCord = (int) e.getX(); 
      int yCord = (int) e.getY(); 

      nudgeX = xCord; 
      nudgeY = yCord; 

      //create writeable image and pixelwriter to draw click region 
      WritableImage outlineImg = new WritableImage(pxlRdr, 
        clickedImgW, clickedImgH); 
      PixelWriter pxlWrtr; 
      pxlWrtr = outlineImg.getPixelWriter(); 

      //draws region 
      drawRegion(pxlWrtr, xCord, yCord); 

      //display image with click boundary and link mouseHandler 
      //to refresh on next click 
      ImageView tempImg = new ImageView(outlineImg); 
      tempImg.setFitHeight(360); 
      tempImg.setFitWidth(640); 
      tempImg.setPreserveRatio(true); 
      tempImg.setSmooth(true); 
      myMouseHandler mouseHandler = new myMouseHandler(); 
      tempImg.setOnMouseClicked(mouseHandler); 
      pane.setCenter(tempImg); 

      //print relevant info about click region   
      System.out.println("xCord: " + xCord); 
      System.out.println("yCord: " + yCord + "\n");    
     }//END METHOD 
    }//END INNER CLASS 

이것을 이미지 뷰에 실제 클릭을 처리하는 클래스입니다 만들 경우 여기

입니다 클릭이 발생한 위치를 나타내는 영역을 그립니다. the documentation for preserveRatio에 따르면

//Draws region boundary after user clicks on image 
    private void drawRegion(PixelWriter pxlWrtr, int xCord, int yCord) { 

     Image clickedImg = arrImageList.get(index).getImage(); 
     PixelReader pxlRdr = clickedImg.getPixelReader(); 

     //get image height/width for copy 
     int clickedImgW = (int) clickedImg.getWidth(); 
     int clickedImgH = (int) clickedImg.getHeight(); 

     //draw right vert boundary 
     for(int yTrack = (yCord + 1); yTrack > (yCord - regionSize); yTrack--) { 
     if((yTrack > 0 && yCord < clickedImgH - 1) 
       && (xCord < clickedImgW - 1)) { 
      pxlWrtr.setColor(xCord + 1, yTrack, Color.RED); 
     } 
     } 

     //draw left vert boundary 
     for(int yTrack = (yCord + 1); yTrack > (yCord - regionSize); yTrack--) { 
     if((yTrack > 0 && yCord < clickedImgH - 1) 
       && (xCord - regionSize) >= 0) { 
      pxlWrtr.setColor(xCord - regionSize, yTrack, Color.RED); 
     } 
     } 

     //draw bottom boundary 
     for(int xTrack = (xCord + 1); xTrack >= (xCord - regionSize); xTrack--) { 
     if(xTrack > 0 && yCord < clickedImgH - 1) { 
      pxlWrtr.setColor(xTrack, yCord + 1, Color.RED); 
     } 
     } 

     //draw top boundary 
     for(int xTrack = (xCord + 1); xTrack >= (xCord - regionSize); xTrack--) { 
     if(xTrack >= 0 && (yCord - regionSize) >= 0) { 
      pxlWrtr.setColor(xTrack, yCord - regionSize, Color.RED); 
     } 
     } 
    }//END METHOD 
+0

MouseEvent c 좌표가 스케일 된 이미지의 좌표가됩니까? 마우스 이벤트는 항상 화면 픽셀을 기반으로하며 이미지 크기 조정에 따라 절대 크기가 조정되지 않습니다. – VGR

+0

그래, 그게 꽤 문제가 @ VGR 그럼 어떻게 하나의 거래 규모의 이미지를 클릭합니까? –

답변

0

:

... 조정 된 이미지의 크기와 동일 할 것이다 노드의 경계에 의해보고 된이 노드의 크기 ...

그래서 당신은 사용할 수 있습니다 MouseEvent 좌표의 크기를 조절하는 것입니다 :

double x = e.getX(); 
double y = e.getY(); 

ImageView view = (ImageView) e.getSource(); 
Bounds bounds = view.getLayoutBounds(); 
double xScale = bounds.getWidth()/view.getImage().getWidth(); 
double yScale = bounds.getHeight()/view.getImage().getHeight(); 

x /= xScale; 
y /= yScale; 

int xCord = (int) x; 
int yCord = (int) y; 
관련 문제