都知道java中类只能单继承,但可以实现多个接口,但我发现实现多个接口之后,多个接口却不能共享同一个数据,应用开发中想实现:当用户按着ctrl键时,可以用鼠标点击拖动组件,比如说文本框。
编写一个监听实现KeyListener,NouseListener,MouseMotionListener三个接口,重写方法。定义一个全局变量boolean ctrlPressed;
@Override
public void keyPressed(KeyEvent e) {
if(e.getModifiers()==InputEvent.CTRL_MASK)
{
ctrlPressed=true;
System.out.println("ctrl is pressed");
}
}@Override
public void keyReleased(KeyEvent e) {
ctrlPressed=false;
System.out.println("ctrl release");
}
用户在按下ctrl的时候为true,在MouseMotionListener接口的方法中判断ctrlPressed是否为真。
public void mouseDragged(MouseEvent e) {
if(ctrlPressed)
{
...........//实现拖动
}
}
这么写也不会报错,结果呢,mouseDragged方法中ctrlPressed却一直是false,按照逻辑来说用户按着ctrl,在keyPressed已经更改了ctrlPressed=true了呀!所以咯,不同的接口的方法是不能共用同一个变量的,全局变量,ctrlPressed,在不同的监听域中创建了不同的存储单元,也可以说是私有化了!我的解决办法是,创建一个类SharedData,创建静态变量ctrlPressed,而在keyPressed,和MouseDagged方法中都是用这个静态变量就能共用了!下面是我的具体实现代码,这个监听类,这个类可以实现选中组件中间移动组件,四周放大缩小组件,用的时候只需要添加监听即可,三个都要加哦
diamend.addMouseMotionListener(new PainRectListener(mJFrame,diamend));
diamend.addMouseListener(new PainRectListener(mJFrame,diamend));
diamend.addKeyListener(new PainRectListener(mJFrame,diamend));
package com.msi.frame; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextPane; import javax.swing.KeyStroke; /** * 組件拖動事件的監聽,任意組件都可以使用這個方法 * @author sharkliu * */ public class PainRectListener implements KeyListener,MouseListener,MouseMotionListener{ private JFrame mJFrame; private JTextPane panel; //private boolean ctrlPressed=false; public PainRectListener(JFrame mJFrame,JTextPane panel) { this.mJFrame=mJFrame; this.panel=panel; } /**当前是否操作图片**/ private boolean isContains(Point point){ Rectangle rectangle = new Rectangle(); rectangle.x=0; rectangle.y = 0; rectangle.width = ShareData.componentSize[0]; rectangle.height = ShareData.componentSize[1]; return rectangle.contains(point); } /**得到是否是点击的4个边中的1个(0,1,2,3,4)**/ private int getPressSide(Point point){ int side = 0; Rectangle rectTop = new Rectangle(0,0,ShareData.componentSize[0],8); Rectangle rectBottom = new Rectangle(0,ShareData.componentSize[1]-8,ShareData.componentSize[0],8); Rectangle rectLeft = new Rectangle(0,8,8,ShareData.componentSize[1]-8); Rectangle rectRight = new Rectangle(ShareData.componentSize[0]-8,8,8,ShareData.componentSize[1]-8); if(rectTop.contains(point)){ return 1; //上 }else if(rectBottom.contains(point)){ System.out.println("下"); return 2; //下 }else if(rectLeft.contains(point)){ System.out.println("左"); return 3; //左 }else if(rectRight.contains(point)){ System.out.println("右"); return 4; //右 } return side; //中间 } public void mouseDragged(MouseEvent e) { System.out.println(ctrlPressed); if(ShareData.isPressComponent&&ShareData.ctrlPressed){ System.out.println("mouseDragged ininin"); Point nowPoint = e.getPoint(); //当前鼠标拖拽到的鼠标位置 int diffX = nowPoint.x - ShareData.pressPoint.x; int diffY = nowPoint.y - ShareData.pressPoint.y; /**移动**/ if(ShareData.moveSide == 0){ ShareData.componentPoint.x += diffX; ShareData.componentPoint.y += diffY; } /**收缩**/ else{ //收缩 下和右时 if(ShareData.moveSide == 2 || ShareData.moveSide == 4){ if(ShareData.moveSide == 2) //拉下(只能拉长拉短) ShareData.componentSize[1] += diffY; else //拉右(只能拉宽拉窄) ShareData.componentSize[0] += diffX; } //收缩 上和左时 else if(ShareData.moveSide == 1 || ShareData.moveSide == 3){ if(ShareData.moveSide == 1){ //拉上边(只能拉长拉短) ShareData.componentPoint.y += diffY; ShareData.componentSize[1] -= diffY; }else{ //拉左边(只能拉宽拉窄) ShareData.componentPoint.x += diffX; ShareData.componentSize[0] -= diffX; } } ShareData.pressPoint = nowPoint; } //拖動組件改變組件的的寬不能超出黑框區域,以及防止拖動時把組件給拖沒了當size小於0組件無法匯出,便消失了 if( (ShareData.componentSize[0]>=20)&&(ShareData.componentSize[1]>=20)) { System.out.println("e"+e.getComponent()); panel.setBounds(ShareData.componentPoint.x, ShareData.componentPoint.y, ShareData.componentSize[0], ShareData.componentSize[1]); panel.setPreferredSize(new Dimension(ShareData.componentSize[0],ShareData.componentSize[1])); panel.setSize(ShareData.componentSize[0], ShareData.componentSize[1]); mJFrame.validate();// 重构内容面板 mJFrame.repaint();// 重绘内容面板 } } } private void paintRect(Graphics graphics) { graphics.drawLine(1, ShareData.componentSize[1]/2-1, ShareData.componentSize[0]/2-1, 1); graphics.drawLine(ShareData.componentSize[0]/2-1,2, ShareData.componentSize[0]-1, ShareData.componentSize[1]/2-1); graphics.drawLine(ShareData.componentSize[0]-1, ShareData.componentSize[1]/2-1, ShareData.componentSize[0]/2-1, ShareData.componentSize[1]-1); graphics.drawLine(ShareData.componentSize[0]/2-1, ShareData.componentSize[1]-1, 1, ShareData.componentSize[1]/2-1); } public void mouseMoved(MouseEvent e) { Rectangle rectTop = new Rectangle(0,0,ShareData.componentSize[0],8); Rectangle rectBottom = new Rectangle(0,ShareData.componentSize[1]-8,ShareData.componentSize[0],8); Rectangle rectLeft = new Rectangle(0,8,8,ShareData.componentSize[1]-8); Rectangle rectRight = new Rectangle(ShareData.componentSize[0]-8,8,8,ShareData.componentSize[1]-8); if(rectTop.contains(e.getPoint())){ e.getComponent().setCursor(new Cursor(Cursor.N_RESIZE_CURSOR)); }else if(rectBottom.contains(e.getPoint())){ System.out.println("下"); e.getComponent().setCursor(new Cursor(Cursor.S_RESIZE_CURSOR)); }else if(rectLeft.contains(e.getPoint())){ e.getComponent().setCursor(new Cursor(Cursor.W_RESIZE_CURSOR)); }else if(rectRight.contains(e.getPoint())){ e.getComponent().setCursor(new Cursor(Cursor.E_RESIZE_CURSOR)); } else{ e.getComponent().setCursor(new Cursor(Cursor.MOVE_CURSOR)); } } public void mouseClicked(MouseEvent e) { } /**把組件所占的矩阵用变量表示出来(便于判断是否操作图片)**/ /** * * 跟新初始化數 * */ public void mousePressed(MouseEvent e) { ShareData.componentPoint=e.getComponent().getLocation(); ShareData.componentSize[0]=e.getComponent().getSize().width; ShareData.componentSize[1]=e.getComponent().getSize().height; //這是爲了區分對待圖片和文本,圖片隨時可以拖動,不受管控 if(isContains(new Point(e.getPoint().x, e.getPoint().y))){ ShareData.moveSide = getPressSide(new Point(e.getPoint().x, e.getPoint().y)); //记录操作图片的边 ShareData.isPressComponent = true; ShareData.pressPoint = e.getPoint(); }else{ ShareData.isPressComponent = false; } } public void mouseReleased(MouseEvent e) { ShareData.isPressComponent = false; ShareData.pressPoint = null; } public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} @Override public void keyTyped(KeyEvent e) {} @Override public void keyPressed(KeyEvent e) { if(e.getModifiers()==InputEvent.CTRL_MASK) { ShareData.ctrlPressed=true; System.out.println("ctrl is pressed"); } } @Override public void keyReleased(KeyEvent e) { ShareData.ctrlPressed=false; System.out.println("ctrl release"); } }
package com.msi.frame; import java.awt.Component; import java.awt.Point; import javax.swing.JComponent; /** * 名字為共享數據,專門記錄工具欄點擊了那些屬性, * 在版面繪製的時候,可先查看這個類中有哪些動作 * @author sharkliu * */ public class ShareData { public static int textFont=12; public static int textStyle; public static boolean dragable=false;//可拖動 public static boolean editable=true;//可編輯 public static Component selectCompoment=null; public static int layer=1000;// /* * 控制組件移動、變形等需要共用到的數據 */ public static int[]componentSize=new int[]{1,1};//組件大小 public static boolean isPressComponent=false; //是否操作組件、圖片或者文本框 public static int moveSide=0; //拉升的边(0:移动 1:上 2:下 3:左 4:右) public static Point componentPoint; //組件(圖片或者文本框)位置 public static Point pressPoint; //press組件时的鼠标位置 //控制文字樣式的按鈕背景變換 public static boolean isBorder=false; public static boolean isItalic=false; public static boolean isUnderline=false; public static String CMD=""; public static boolean ctrlPressed=false; }
相关推荐
总结来说,"Swing导航按钮——鼠标拖动按钮变换位置"这个例子涉及到Swing组件的自定义、鼠标事件处理以及组件位置的动态调整,是学习Swing高级特性和用户交互设计的好素材。通过实践和理解这个例子,开发者可以提升...
当用户按下鼠标按钮并移动鼠标时,组件会跟随鼠标移动,直到用户释放鼠标按钮。这个过程通过监听鼠标的点击、拖动和释放事件来实现。 2. **添加监听器** - 首先,你需要为组件添加MouseListener,以便检测到鼠标被...
综上所述,"java swing 鼠标自动移动"项目结合了Java Swing GUI编程、鼠标事件处理、Robot类的使用、以及应用打包技术,为开发者提供了一个实用的示例,展示了如何在Java环境中实现鼠标自动移动。
在Java的Swing库中,实现组件的透明拖动是一项常用的功能,这使得用户界面更加美观和交互友好。Swing提供了丰富的组件库,允许开发者创建复杂的GUI应用,并且支持自定义外观和行为。本篇文章将深入探讨如何在Swing中...
Swing扩展组件是Java Swing库中的一个重要组成部分,它提供了丰富的用户界面元素,使得开发者能够创建出功能强大且具有吸引力的图形用户界面(GUI)。Swing是Java AWT(抽象窗口工具包)的一个替代品,提供了更多的...
在深入学习:JFC SWING—JAVA 基础类组件集.pdf 中,你将找到关于这些组件和概念的详细讲解,包括它们的用法、属性、方法以及示例代码。通过阅读这份资料,你应该能更好地掌握如何使用 JFC Swing 构建功能丰富的 GUI...
在Java的Swing库中,开发GUI应用程序时,我们经常需要处理多个窗口之间的交互和数据共享,这在实际应用中非常常见,例如在一个主窗口进行操作,然后更新其他子窗口的信息。本示例"swing多窗口联动的实现示例"就是...
在Java Swing中,JTable是一个非常重要的组件,它允许用户查看和操作二维数据。然而,有时候我们可能希望禁用JTable的列头拖动功能,以便用户不能改变列的顺序。 在标题"java swing 表头不可拖动"中,提到的问题是...
Swing是Java编程语言中的一个图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分。在 Swing 中,开发者可以创建丰富的、高度可定制的桌面应用程序。本教程主要聚焦于Swing中的各种组件及其用法,...
Swing是Java编程语言中的一个图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分。Swing提供了一系列组件,使得开发者可以构建功能丰富的、具有吸引力的桌面应用程序。以下是一些Swing组件的详细...
标题"java获取鼠标坐标位置swing"指的是利用Java Swing来编程,实现在Swing组件上显示鼠标移动时的坐标位置。 首先,要获取鼠标坐标,我们需要导入必要的Java Swing库,如`javax.swing.*` 和 `java.awt.event.*`。...
TabbedPane组件提供了多页签的功能,可以在同一空间内展示多个面板,每个面板可以包含不同的组件和内容。这对于组织复杂界面非常有用,可以避免用户在多个窗口间切换。 在编程过程中,良好的设计思维和方法至关重要...
在Java的Swing库中,实现拖动控件的功能是一项常见的需求,这使得用户可以通过鼠标进行交互,将组件在窗口内自由移动。标题"swing 拖动控件"所指的就是利用Swing来实现这一功能的技术。描述中提到的"一个简单的类...
在Swing中,主要通过`javax.swing.JPrintTable`和`javax.swing.JTable`等组件,以及`javax.print.PrintService`、`javax.print.DocFlavor`和`javax.print.PrintRequestAttributeSet`等接口和类来完成打印任务。...
Java Swing是Java标准库中的一个组件集合,用于构建桌面应用程序用户界面。它是Java Foundation Classes (JFC)的一部分,提供了一套轻量级的GUI(图形用户界面)组件,支持丰富的交互功能。本离线API文档详细阐述了...
JMenuBar 是 Java Swing 中的一个菜单栏组件,继承自 javax.swing.JComponent 类。JMenuBar 提供了一个基本的菜单栏,可以用来创建菜单项和子菜单项。在上面的代码中,我们可以看到 MenuTest 类继承自 JMenuBar,...
在Java Swing库中,实现鼠标拖拽功能是构建桌面应用程序时常见的需求,它涉及到事件处理、组件交互以及图形用户界面(GUI)的设计。本源码着重于如何在Swing组件上实现鼠标拖放操作,这对于创建自定义组件或增强已有...
在Swing中,组件通常被称为JComponents,因为它们继承自`javax.swing.JComponent`类。下面将详细探讨Swing用户界面组件及其主要特点。 1. **基本组件** - **JButton**: 这是最常见的组件,用于创建按钮。可以设置...
在Java的Swing库中,鼠标事件(Mouse Events)是用户与GUI组件交互的重要部分,而loading效果则通常指的是在处理耗时操作时显示的一种视觉指示,以告知用户程序正在运行且尚未完成。本篇文章将深入探讨如何在Swing...
综上所述,"swing组件介绍(一)"可能会涵盖Swing的基本概念、核心组件、布局管理、事件处理以及一些实用工具类,帮助初学者理解Swing在开发Java桌面应用中的重要性和用法。对于深入学习Swing,开发者还需要了解高级...