`
liaoguizhu
  • 浏览: 6973 次
文章分类
社区版块
存档分类
最新评论

JavaSwing中随意拖动组件的位置

阅读更多
在很多地方都看到有人问怎么拖动组件的位置,其实非常简单,就是鼠标监听加一个算法而已,代码承上。
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class DraggedTest extends JFrame {

	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);
		
		JPanel panel_1 = new JPanel();
		panel_1.setBackground(Color.GRAY);
		panel_1.setBounds(82, 85, 130, 130);
		panel.add(panel_1);
		
		JPanel panel_2 = new JPanel();
		panel_2.setBackground(Color.LIGHT_GRAY);
		panel_2.setBounds(261, 85, 130, 130);
		panel.add(panel_2);
		
		JPanel panel_3 = new JPanel();
		panel_3.setBackground(Color.MAGENTA);
		panel_3.setBounds(450, 85, 130, 130);
		panel.add(panel_3);
		
		JPanel 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());
		}

	}
}

分享到:
评论

相关推荐

    Java中Swing的相关知识(2)

    ### Java Swing 中的关键组件及其应用 #### 面板(JPanel) 在Java Swing中,`JPanel`是一个重要的轻量级容器组件,类似于AWT中的`Panel`,但提供了更多的功能和更好的跨平台表现。`JPanel`主要用于容纳其他界面...

    JAVA实现的图片大小随意拉动调整

    本示例中的"JAVA实现的图片大小随意拉动调整"着重讲解了如何利用Swing来实现图片的动态缩放功能,让用户可以自由调整图片的大小。这个功能在很多应用中都非常实用,比如图像查看器、编辑器或者任何需要展示可调整...

    Java收集的代码段1(待续)常用代码段

    3. **组件随意拖动**:实现组件拖动功能,通常需要监听鼠标事件,包括鼠标按下、移动和释放。在鼠标按下时记录组件的初始位置,然后在鼠标移动事件中更新组件的位置。 ```java component.addMouseListener(new ...

    eclipse配置(安装)swing插件

    - 可以直接从组件库中拖拽按钮、文本框等UI元素到设计区域,并通过属性面板调整其样式和行为。 #### 四、总结 通过以上介绍可以看出,无论是在线还是离线方式,安装Swing插件的过程都相对简单。选择最适合当前网络...

    java画图板(直线、矩形、圆、随意线条)

    在Java编程语言中,创建一个简单的画图板应用程序是一个经典的练习,它可以帮助初学者更好地理解图形用户界面(GUI)的设计和事件处理。本项目通过Java实现了基本的绘图功能,包括绘制直线、矩形、圆形以及自由绘制...

    Java的小技巧(很小的)

    在Java Swing中创建一组互斥的单选按钮,通常需要将它们加入到同一个`ButtonGroup`中,这样当选择其中一个按钮时,其他按钮会被自动取消选择状态。 ```java ButtonGroup jButtonGroup = new ButtonGroup(); ...

    Java简易画图板

    本项目可能使用了Swing,因为它是一个相对成熟的库,包含丰富的组件和事件处理机制,适合快速开发这样的小型桌面应用。 3. **绘图工具**: - **直线**:在画图板中,直线工具允许用户通过鼠标点击并拖动来绘制直线...

    java几何图形

    在Java编程语言中,开发图形用户界面(GUI)应用程序是一个重要的技能,这通常涉及到使用Java AWT(Abstract Window Toolkit)或Swing库。本程序就是一个使用这些库来创建和操作几何图形的例子,如圆、三角形和矩形...

    JIDE Action Framework(动作框架)开发员技术手册

    1. **强大的命令栏(Command Bar)组件**:该框架引入了一个全新的组件——命令栏,用于替代传统的Swing工具栏和菜单栏。命令栏不仅具备传统组件的所有功能,还增加了许多高级特性,如随意拖放、调整大小等。 2. **...

    2021-2022计算机二级等级考试试题及答案No.11130.docx

    - **知识点**:Swing中创建框架窗口的组件。 - **解析**:选项B(JFrame)正确。`JFrame`是Swing中用于创建框架窗口的主要容器类。 #### 24. 多个分院网站的设置 - **知识点**:Web服务器上设置多个站点的方法。 -...

    2021-2022计算机二级等级考试试题及答案No.9204.docx

    - **默认行为**:Windows的任务栏默认位于屏幕底部,且不可以随意拖动至桌面任意位置。 - **限制**:虽然可以通过设置使其移动到屏幕的其他边缘,但并不能自由放置于桌面任意位置。 #### 知识点十七:满二叉树的...

    2021-2022计算机二级等级考试试题及答案No.2811.docx

    - **解析**: Swing是Java的一个图形用户界面工具包,提供了丰富的UI组件,如JPanel、JTable和JFrame等。但是“Menu”并不是Swing中的一个特定组件,而是指代菜单功能的概念。 - **正确答案**: C. Menu #### 数据...

Global site tag (gtag.js) - Google Analytics