2015-11-25 3 views
2

Мне интересно, какой лучший способ получить местоположение клика мыши после того, как было сделано масштабирование с использованием paintComponent панели? (Расположение относительно этого увеличения).Увеличение и уменьшение jPanel

Вот код масштабирования:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    if(zoomer==true){  
     at.scale(zoom,zoom);//at = AffineTransform... 
     zoomer=false; 
    } 
    g2.transform(at); 

В моем главном классе, я использую мышь слушателя частный класс и переопределить метод mouseRelase:

@Override 
    public void mouseReleased(MouseEvent e) 
    e.getX();//Location of the mouse on the X axis 

Я рисую различные формы, такие как точки. Каждая точка имеет свои пиксельные местоположения, поэтому, если создать их в X: 20 и Y: 30, это никогда не изменится. Когда я называю paintComponent, он масштабируется либо больше, либо меньше. Моя проблема заключается в том, что я могу зафиксировать расположение этих точек на панели, и это дает мне некоторую информацию в некоторых текстовых полях о точках, на которые я нажал. Если панель была увеличена в/из, местоположение клика по-прежнему остается таким же, поэтому, скажем, я увеличиваю масштаб, формы будут не в x: 20 и y: 30, а в случайном месте на основе шкалы. Как я могу изменить свое местоположение в этом масштабе?

Не уверен, что я делаю myselft ясным, поэтому не стесняйтесь, если вам нужна дополнительная информация.

Спасибо

ответ

4

Хорошо, я работал всю ночь, и, наконец, понял, как это сделать.

Прежде всего, вот что происходит, когда я крутите колесо мыши:

@Override 
    public void mouseWheelMoved(MouseWheelEvent e) { 

     //Zoom in 
     if(e.getWheelRotation()<0){ 
      mydrawer.setZoomFactor(1.1*mydrawer.getZoomFactor()); 
      mydrawer.repaint(); 
     } 
     //Zoom out 
     if(e.getWheelRotation()>0){ 
      mydrawer.setZoomFactor(mydrawer.getZoomFactor()/1.1); 
      mydrawer.repaint(); 
     } 
    } 

Метод setZoomFactor делает это:

public void setZoomFactor(double factor){   
    if(factor<this.zoomFactor){ 
     this.zoomFactor=this.zoomFactor/1.1; 
    } 
    else{ 
     this.zoomFactor=factor; 
    } 
    this.zoomer=true; 
} 

После, когда я называю перекрасить() Я превратить свой объект Graphics2D для увеличения:

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    if(zoomer==true){  
     at = new AffineTransform(); 
     at.scale(zoomFactor,zoomFactor); 
     zoomer=false; 
    } 
    g2.transform(at); 

На данный момент ничего действительно нового ... Моя проблема wa когда я нажал на обратный объект после масштабирования, мне нужно было просто расположить клик относительно коэффициента масштабирования. В моем случае, мне нужен 0 из оси Y, чтобы быть в левом нижнем углу вместо верхнего левого угла по умолчанию, поэтому я должен был обратить значение, основанное на высоте панели:

@Override 
    public void mouseReleased(MouseEvent e) { 
     int myXLocationWithoutZoom = e.getX()*(1/myDrawer.getZoomFactor()); 
     int myYLocationWithoutZoom = myPanel.getSize().height-((e.getY())*(1/myDrawer.getZoomFactor())); 

Если вы вычисляете дайте мне знать, другой способ сделать это или подумать, что я не сделал этого по-хорошему.

Спасибо

Смежные вопросы