package yan.wen.test; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class DraggedTest extends JFrame { private final JPanel panel_1; private final JPanel panel_2; private final JPanel panel_3; private final JPanel panel_4; private JPanel contentPane; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { DraggedTest frame = new DraggedTest(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public DraggedTest() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(660, 500); setLocationRelativeTo(null); contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); add(contentPane); JPanel panel = new JPanel(); contentPane.add(panel, BorderLayout.CENTER); panel.setBorder(BorderFactory.createLineBorder(Color.orange, 2)); panel.setLayout(null); panel_1 = new JPanel(); panel_1.setBackground(Color.GRAY); panel_1.setBounds(82, 85, 130, 130); panel.add(panel_1); panel_2 = new JPanel(); panel_2.setBackground(Color.LIGHT_GRAY); panel_2.setBounds(261, 85, 130, 130); panel.add(panel_2); panel_3 = new JPanel(); panel_3.setBackground(Color.MAGENTA); panel_3.setBounds(450, 85, 130, 130); panel.add(panel_3); panel_4 = new JPanel(); panel_4.setBackground(Color.ORANGE); panel_4.setBounds(261, 285, 130, 130); panel.add(panel_4); MyListener m = new MyListener(); panel_1.addMouseListener(m); panel_1.addMouseMotionListener(m); panel_2.addMouseListener(m); panel_2.addMouseMotionListener(m); panel_3.addMouseListener(m); panel_3.addMouseMotionListener(m); panel_4.addMouseListener(m); panel_4.addMouseMotionListener(m); } // 写一个类继承鼠标监听器的适配器,这样就可以免掉不用的方法。 class MyListener extends MouseAdapter{ //这两组x和y为鼠标点下时在屏幕的位置和拖动时所在的位置 int newX,newY,oldX,oldY; //这两个坐标为组件当前的坐标 int startX,startY; @Override public void mousePressed(MouseEvent e) { //此为得到事件源组件 Component cp = (Component)e.getSource(); //当鼠标点下的时候记录组件当前的坐标与鼠标当前在屏幕的位置 startX = cp.getX(); startY = cp.getY(); oldX = e.getXOnScreen(); oldY = e.getYOnScreen(); } @Override public void mouseDragged(MouseEvent e) { Component cp = (Component)e.getSource(); //拖动的时候记录新坐标 newX = e.getXOnScreen(); newY = e.getYOnScreen(); //设置bounds,将点下时记录的组件开始坐标与鼠标拖动的距离相加 cp.setBounds(startX+(newX - oldX), startY+(newY - oldY), cp.getWidth(), cp.getHeight()); } @Override public void mouseReleased(MouseEvent e) { Component cp = (Component)e.getSource(); newX = e.getXOnScreen(); newY = e.getYOnScreen(); int x = cp.getX(); int y = cp.getY(); if (x < 0){ x = 0+1; } if (y < 0){ y = 0+1; } if (x > getWidth()-cp.getWidth()){ x = getWidth()-cp.getWidth(); } if (y > getHeight()-cp.getHeight()){ y = getHeight()-cp.getHeight(); } if (x != cp.getX() || y != cp.getY()){ cp.setBounds(x, y, cp.getWidth(), cp.getHeight()); } } } }
最近下载更多
微信网友_6443749026975744 LV1
2023年4月22日
cjjjyy LV1
2023年3月3日
ezio_ding LV1
2022年11月1日
wadadd LV7
2022年9月13日
lizhenlinok LV10
2021年1月22日
黑衫大魔王 LV1
2019年12月12日
765933786 LV1
2019年6月4日
天大地大我最大 LV2
2019年1月13日
339238137 LV1
2018年12月28日
最代码官方 LV168
2018年8月9日
最近浏览更多
woldxy LV12
4月1日
yangxb2 LV10
2023年10月20日
微信网友_6443749026975744 LV1
2023年4月22日
xingxing1234 LV10
2023年3月22日
cjjjyy LV1
2023年3月3日
ezio_ding LV1
2022年11月1日
lingtiejing LV15
2022年10月30日
wadadd LV7
2022年9月13日
liys1234 LV9
2022年4月22日
wyx065747 LV67
2022年3月9日