Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何拖动对象_Java_Applet_Cursor_Drag - Fatal编程技术网

Java 如何拖动对象

Java 如何拖动对象,java,applet,cursor,drag,Java,Applet,Cursor,Drag,我想拖动一个框,我想我的鼠标光标是我在拖动矩形时在矩形中单击的位置。我尝试了这段代码,当我尝试拖动时,我得到了一堆错误 import objectdraw.*; import java.awt.*; public class TouchWindow extends WindowController { private FilledRect a; private boolean b; private Location c; private int x;

我想拖动一个框,我想我的鼠标光标是我在拖动矩形时在矩形中单击的位置。我尝试了这段代码,当我尝试拖动时,我得到了一堆错误

import objectdraw.*;

import java.awt.*;

public class TouchWindow extends WindowController
{

    private FilledRect a;
    private boolean b;
    private Location c;
    private int x;
    private int y;
    public void begin()
    {
        b=false;
        a=new FilledRect(0,0,50,50,canvas);
    }
    public void onMouseClick(Location pt)
    {
        if(a.contains(pt))
        {
        b=true;
        pt=c;
        }
    }
    public void onMouseDrag(Location pt2)
    {
        if(b==true)
        {
        x=(int)c.getX()-(int)pt2.getX();
        y=(int)c.getY()-(int)pt2.getY();
        a.move(x,y);
        }
    }
}

嗯,这里有一个例子,虽然不是小程序,但它可以非常简单地移植

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ShapeMover {

    public ShapeMover() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Shape Mover");

        initComponents(frame);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String s[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ShapeMover();
            }
        });

    }

    private void initComponents(JFrame frame) {
        frame.getContentPane().add(new DragPanel());
    }
}

class DragPanel extends JPanel {

    Rectangle rect = new Rectangle(0, 0, 100, 50);
    int preX, preY;
    boolean isFirstTime = true;
    Rectangle area;
    boolean pressOut = false;
    private Dimension dim = new Dimension(400, 300);

    public DragPanel() {
        setBackground(Color.white);
        addMouseMotionListener(new MyMouseAdapter());
        addMouseListener(new MyMouseAdapter());
    }

    @Override
    public Dimension getPreferredSize() {
        return dim;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;
        if (isFirstTime) {
            area = new Rectangle(dim);
            rect.setLocation(50, 50);
            isFirstTime = false;
        }

        g2d.setColor(Color.black);
        g2d.fill(rect);
    }

    boolean checkRect() {
        if (area == null) {
            return false;
        }

        if (area.contains(rect.x, rect.y, rect.getWidth(), rect.getHeight())) {
            return true;
        }

        int new_x = rect.x;
        int new_y = rect.y;

        if ((rect.x + rect.getWidth()) > area.getWidth()) {
            new_x = (int) area.getWidth() - (int) (rect.getWidth() - 1);
        }
        if (rect.x < 0) {
            new_x = -1;
        }
        if ((rect.y + rect.getHeight()) > area.getHeight()) {
            new_y = (int) area.getHeight() - (int) (rect.getHeight() - 1);
        }
        if (rect.y < 0) {
            new_y = -1;
        }
        rect.setLocation(new_x, new_y);
        return false;
    }

    private class MyMouseAdapter extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            preX = rect.x - e.getX();
            preY = rect.y - e.getY();

            if (rect.contains(e.getX(), e.getY())) {
                updateLocation(e);
            } else {
                pressOut = true;
            }
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            if (!pressOut) {
                updateLocation(e);
            } else {
            }
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            if (rect.contains(e.getX(), e.getY())) {
                updateLocation(e);
            } else {
                pressOut = false;
            }
        }

        public void updateLocation(MouseEvent e) {
            rect.setLocation(preX + e.getX(), preY + e.getY());
            checkRect();

            repaint();
        }
    }
}

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类ShapeMover{
公共ShapeMover(){
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle(“形状移动器”);
初始组件(框架);
frame.pack();
frame.setVisible(true);
}
公共静态void main(字符串s[]{
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
新的ShapeMover();
}
});
}
私有组件(JFrame){
frame.getContentPane().add(新的DragPanel());
}
}
类DragPanel扩展了JPanel{
矩形rect=新矩形(0,0,100,50);
intprex,猎物;
布尔值isFirstTime=true;
矩形区域;
布尔值pressOut=false;
私有维度dim=新维度(400300);
公共绘图板(){
挫折地面(颜色:白色);
addMouseMotionListener(新的MyMouseAdapter());
addMouseListener(新的MyMouseAdapter());
}
@凌驾
公共维度getPreferredSize(){
返回暗淡;
}
@凌驾
公共组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
如果(是第一次){
面积=新矩形(尺寸);
直肠定位(50,50);
isFirstTime=false;
}
g2d.setColor(Color.black);
g2d.填充(矩形);
}
布尔checkRect(){
如果(面积==null){
返回false;
}
if(area.contains(rect.x,rect.y,rect.getWidth(),rect.getHeight())){
返回true;
}
int new_x=rect.x;
int new_y=rect.y;
如果((rect.x+rect.getWidth())>area.getWidth()){
new_x=(int)area.getWidth()-(int)(rect.getWidth()-1);
}
if(矩形x<0){
新的_x=-1;
}
如果((rect.y+rect.getHeight())>area.getHeight()){
new_y=(int)area.getHeight()-(int)(rect.getHeight()-1);
}
if(矩形y<0){
新的y=-1;
}
矩形设置位置(新x,新y);
返回false;
}
私有类MyMouseAdapter扩展了MouseAdapter{
@凌驾
公共无效鼠标按下(MouseEvent e){
preX=rect.x-e.getX();
preY=rect.y-e.getY();
if(rect.contains(e.getX(),e.getY()){
更新位置(e);
}否则{
pressOut=true;
}
}
@凌驾
公共无效鼠标标记(鼠标事件e){
如果(!按出){
更新位置(e);
}否则{
}
}
@凌驾
公共无效MouseEvent(MouseEvent e){
if(rect.contains(e.getX(),e.getY()){
更新位置(e);
}否则{
按出=假;
}
}
public void updateLocation(MouseEvent e){
直肠定位(preX+e.getX(),preY+e.getY());
checkRect();
重新油漆();
}
}
}

+1用于边界检查;也可以看到这个相关的+1,谢谢你,但这并不是很好,边界检查是硬编码的,只看到现在它改变了:P。。。你也有一个很好的例子。