为什么在拖动时会是这样?好像有个影子,并且还不能紧跟鼠标。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class t
{
public static void main(String args[])
{
JFrame.setDefaultLookAndFeelDecorated(true);
frame f = new frame();
}
}class frame extends JFrame{
JLabel nd;
int lx,ly,focusx,focusy;
public frame()
{
super("asdfsadf");
setSize(500,500);

Container c=getContentPane();
c.setBackground(Color.white);
c.setLayout(null);

JLabel  b1=new JLabel("sdfasf");
b1.setBounds(200,200,100,25);
b1.addMouseListener(new MouseProcess());
b1.addMouseMotionListener(new MouseMotionProcess());
c.add(b1);
show();
} private class MouseProcess extends MouseAdapter
{ public void mousePressed(MouseEvent e)
{
nd=(JLabel)e.getSource();
lx=e.getX();ly=e.getY();
focusx = nd.getX(); focusy = nd.getY();
nd=null;
}

public void mouseReleased(MouseEvent e)
{

}
} private class MouseMotionProcess extends MouseMotionAdapter
{
public void mouseDragged(MouseEvent e)
{
nd=(JLabel)e.getSource();
int w = lx-focusx;
int h = ly-focusy;
int x = e.getX()+w+focusx-lx;
int y = e.getY()+h+focusy-ly;
if( x < 0 ) x = 0; if( y < 0 ) y = 0;
nd.setLocation(x, y);
nd.updateUI();
}


}}

解决方案 »

  1.   

    给你个demo:
    package project1.demo1;import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.Image;
    import java.awt.Rectangle;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import javax.swing.JApplet;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JViewport;public class Contenttest extends JApplet {
    JButton b = new JButton("add"); public void init() { // contentPane.add(desk, BorderLayout.CENTER);
    final JScrollPane scrollPane = new JScrollPane();
    Glasspane glass = new Glasspane(b);
    JViewport view = new JViewport() {
    public void paintComponent(Graphics g) {
    Dimension size = getSize();
    Image image = getToolkit().getImage("C:/DefaultMap.gif");
    g.drawImage(image, 0, 0, size.width, size.height, this);
    }
    };
    scrollPane.setViewport(view);
    glass.setOpaque(false);
    scrollPane.setViewportView(glass);
    getContentPane().add(b, BorderLayout.NORTH);
    getContentPane().add(scrollPane, BorderLayout.CENTER);
    }
    }class Glasspane extends JPanel {
    JLabel jButton2 = new JLabel(); JButton b = new JButton("add"); int m = 0; public Glasspane(JButton b) {
    super();
    this.b = b;
    this.setLocale(java.util.Locale.getDefault());
    setLayout(new FlowLayout());
    b.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    m = m + 1;
    buttons jButton1 = new buttons();
    add(jButton1);
    revalidate();
    }
    });
    this.setSize(400, 500);
    this.setVisible(true);
    setOpaque(false);
    } // private class MouseProcess extends MouseAdapter {
    // public void mouseClicked(MouseEvent e) {
    //
    // }
    //
    // public void mousePressed(MouseEvent e) {
    // int focusx = 0;
    // int focusy = 0;
    // focusx = e.getX();
    // focusy = e.getY();
    //
    // }
    // } class buttons extends JLabel {
    int focusx = 0; int focusy = 0; buttons() {
    setPreferredSize(new Dimension(60, 30));
    setBounds(new Rectangle(86, 113, 73, 25));
    setText("m" + m);
    addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    } public void mousePressed(MouseEvent e) {
    focusx = e.getX();
    focusy = e.getY();
    }
    });
    addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) {
    Container container = getParent();
    System.out.println(container);
    int w = container.getWidth();
    int h = container.getHeight(); int x = getX() + e.getX() - focusx;
    int y = getY() + e.getY() - focusy;
    if (x + getWidth() > w)
    x = w - getWidth();
    if (y + getHeight() > h)
    y = h - getHeight();
    if (x < 0)
    x = 0;
    if (y < 0)
    y = 0;
    // setLocation(x, y);
    setLocation(x, y + getHeight());
    // container.repaint();
    // container = null;
    }
    });
    }
    }
    }
      

  2.   

    import java.awt.Color;
    import java.awt.Container;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;import javax.swing.JFrame;
    import javax.swing.JLabel;public class t
    {
        public static void main(String args[])
        {
            JFrame.setDefaultLookAndFeelDecorated(true);
            frame f = new frame();
        }
    }class frame extends JFrame{
        JLabel nd;
        int    lx, ly, focusx, focusy;    public frame()
        {
            super("asdfsadf");
            setSize(500, 500);        Container c = getContentPane();
            c.setBackground(Color.white);
            c.setLayout(null);        JLabel b1 = new JLabel("sdfasf");
            b1.setBounds(200, 200, 100, 25);
            b1.addMouseListener(new MouseProcess());
            b1.addMouseMotionListener(new MouseMotionProcess());
            c.add(b1);
            show();
        }    private class MouseProcess extends MouseAdapter
        {        public void mousePressed(MouseEvent e)
            {
                nd = (JLabel) e.getSource();
                lx = e.getX();
                ly = e.getY();
    //            focusx = nd.getX() + lx;
    //            focusy = nd.getY() + ly;
                nd = null;
            }        public void mouseReleased(MouseEvent e)
            {        }
        }    private class MouseMotionProcess extends MouseMotionAdapter
        {
            public void mouseDragged(MouseEvent e)
            {
                nd = (JLabel) e.getSource();
                int w = e.getX() - lx;
                int h = e.getY() - ly;
                int x = nd.getX() + w;
                int y = nd.getY() + h;
                if (x < 0)
                    x = 0;
                if (y < 0)
                    y = 0;
                nd.setLocation(x, y);
                nd.updateUI();
            }    }}
      

  3.   

    e.getX()
    和 e.getY()
    是相对于控件内部的 所以你的计算公式就不对了正确的贴上LS