2016-05-27 6 views
2

私は私の画像を押してドラッグすることですが、私は、画像の中央を押したときに、私はドラッグ画像

これは何をドラッグしていたときただし、カーソルが常に画像の上左上に移動します私は enter image description here

をドラッグしていたときにカーソルが常に画像の上左上に移動する画像の中心に enter image description here

を押した写真

と意味します

画像をドラッグしているときにカーソルが画像の中心に来るようにするにはどうすればよいですか?

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class ChessGUI extends JPanel implements MouseListener, MouseMotionListener { 
    final int rows = 8; 
    final int cols = 8; 
    int x = 0; 
    int y = 0; 
    int carx= 0; 
    int cary =0; 
    ImageIcon car; 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (int row = 0; row < 8; row++) { 
      for (int col = 0; col < 8; col++) { 
       x = 50*col; 
       y = 50*row; 
       if ((row % 2) == (col % 2)) 
        g.setColor(Color.white); 
       else 
        g.setColor(Color.black); 
       g.fillRect(x,y,50,50); 
      } 
     } 
     car = new ImageIcon("resources/image/48/br.png"); 
     car.paintIcon(this, g, carx, cary); 
    } 

    public ChessGUI() { 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 


    public static void main(String[] args) { 
     JFrame frame = new JFrame("Chess"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.pack(); 
     frame.setSize(420,450); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(true); 
     frame.setVisible(true); 
     frame.add(new ChessGUI()); 
    } 

    @Override 
    public void mouseDragged(MouseEvent evt) { 
     carx = evt.getX(); 
     cary = evt.getY(); 
     repaint(); 
    } 

    @Override 
    public void mouseMoved(MouseEvent arg0) { 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     int x = e.getX(); 
     int y = e.getY(); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 

    } 

} 
+0

'evt.getX();'と 'evt.getY();'を数ピクセルだけ減らすのは簡単ではないでしょうか?値がマウスの右側を返すように見えます。代わりに 'carx = evt.getX() - SOME_CONSTANT; 'を設定してみてください マウスのサイズはOSなどによって変わる可能性があります。 – Draken

+0

私はあなたのマウスが左上隅にジャンプするのではないと思います。画像の左上隅を指定することで、マウスの位置に画像が表示されます。あなたの画像の位置は左上隅の座標を指定することによって決定され、その位置はマウスの位置です。 – Salivan

答えて

2

カーソルが左上隅に移動しません。あなたのイメージは左上隅をカーソルの位置に移動します。これは、画像の位置が左上隅の座標を指定することで決定されるため、画像のxとyにカーソル座標を割り当てると、画像の左上隅がカーソルのある場所に描画されるためです。

解決策は、画像の幅と高さを取り、両方の値を2で除算し、カーソルの座標から減算してから画像のxとyに代入することです。これにより、画像の中心が常にカーソルの位置になるようになります。

さらに良い解決策は、イメージ上のカーソルをクリックした時点で、カーソルがイメージのどこにあるのかを特定し、イメージのxとyに割り当てる前にカーソル座標を調整することです。

関連する問題