话不多说,先上代码:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.event.MouseInputListener;
public class MainFrame extends JFrame {
final JPanel panel1 = new JPanel();
final JPanel panel2 = new JPanel();
final JPanel maskJPanel = new JPanel();
public MainFrame() {
this.setSize(900, 600);
this.setLayout(null);
this.add(panel1);
this.add(panel2);
this.add(maskJPanel);
panel1.setBounds(0, 0, 100, 100);
panel2.setBounds(200, 0, 100, 100);
panel1.setBackground(new Color(0));
panel2.setBackground(new Color(1));
ImageIcon bgiIcon = new ImageIcon("mask.png");
JLabel bg = new JLabel(bgiIcon);
maskJPanel.add(bg);
bg.setBounds(0, 0, 100, 100);
this.setVisible(true);
Drag drag = new Drag();
addMouseListener(drag);
addMouseMotionListener(drag);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MainFrame mainFrame = new MainFrame();
}
class Drag implements MouseInputListener {
int moving = 0; //显示Panel是否处于移动过程中,否则只要单击便会调用press里面的方法
int xinit = 0; //鼠标按下时所处的X坐标
int yinit = 0; //鼠标按下时所处的Y坐标
int x0 = 0; //拖拽过程中鼠标的位置
int y0 = 0;
Timer timer;
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
//鼠标按下时初始化线程
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
xinit = e.getX();
yinit = e.getY();
timer = new Timer(10, new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
maskJPanel.setBounds(x0 - xinit + panel2.getX(), y0 - yinit
+ panel2.getY(), 100, 100);
}
});
}
//鼠标松开时结束线程
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
if (moving == 1) {
int x1 = e.getX();
int y1 = e.getY();
panel2.setBounds(x1 - xinit + panel2.getX(),
y1 - yinit + panel2.getY(), 100, 100);
moving = 0;
panel2.setVisible(true);
maskJPanel.setVisible(false);
timer.stop();
}
}
//鼠标拖动过程中,不断更新maskPanel的位置
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
x0 = arg0.getX();
y0 = arg0.getY();
if (x0 > panel2.getX() && x0 < (panel2.getX() + panel2.getWidth())
&& y0 > panel2.getY()
&& y0 < (panel2.getY() + panel2.getHeight())) {
moving = 1;
panel2.setVisible(false);
maskJPanel.setVisible(true);
timer.start();
}
}
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
}
首先因为只是一个Demo。所以比较粗糙~
个人认为代码结构还是比较清晰的,其中存在几个小问题:
1. 不大会调节JPanel 的透明度,所以只能自己p了一张图作为拖拽图中显示的Panel
2. 在mouseDragged中,似乎是可以持续监听的,因为加入输出语句后会显示多行坐标数据,但是显示出来的Panel确实直接跳到了一个位置并且不能继续移动,所以才加了个线程控制Panel的位置。。。。。。还是值得继续研究下去
本文介绍如何在Java中实现JPanel的鼠标拖拽功能。代码结构清晰,但存在两个问题:未能调整JPanel透明度,以及在mouseDragged事件中Panel位置更新的不连续性,需要通过线程控制。作者指出这一功能仍有改进空间。
2033

被折叠的 条评论
为什么被折叠?



