精华内容
下载资源
问答
  • 在项目开发中,实现了目录树,目录名过长,或者展开的项比较多,此时水平滚动条会出现,若拖动水平滚动条到中间,或最右端,点击QTreeWidget的某项,会导致水平滚动条移动到最左端。 解决的方法: 首先继承...

    在项目开发中,实现了目录树,当目录名过长,或者展开的项比较多时,此时水平滚动条会出现,若拖动水平滚动条到中间,或最右端,点击QTreeWidget的某项,会导致水平滚动条移动到最左端。

    解决的方法:

    首先继承QTreeWidget,重写它,定义两个变量

     

    1.在类的头文件声明两个变量

        bool                         m_isItemClicked;
        int                          m_horizontalScrollBarPos;

    2.在响应的点击函数里添加如下代码,获取点击时水平滚动条的位置

    void CLocalDirTreeWgt::OnLeftTreeItemClicked(QTreeWidgetItem * item, int column)
    {
        m_isItemClicked = true;
        m_horizontalScrollBarPos = m_leftTreeWidget->horizontalScrollBar()->sliderPosition();   

    }

    3.实现水平滚动条的响应槽函数

    void CLocalDirTreeWgt::onLeftHorizontalScrollBarChange(int value)
    {
        if (m_isItemClicked)
        {
            m_leftTreeWidget->horizontalScrollBar()->setValue(m_horizontalScrollBarPos);
            m_isItemClicked = false;
        }
    }

    4.关联槽函数

        connect(m_leftTreeWidget->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(onLeftHorizontalScrollBarChange(int)));

    展开全文
  • 其次,要了解容什么方式,画一个矩形,设计一个方法:DrawRectgle(左上角,右下角),并且要确定调用这个方法,要把原来已经画好的矩形清除掉(或者是根据左上,右下坐标,调整矩形的大小,这样的话,就不用清除...

    在这里插入图片描述

    首先,你要设计好鼠标事件处理方法,主要是鼠标左键点击,左键释放,还有鼠标移动方法
    其次,要了解容什么方式,画一个矩形,设计一个方法:DrawRectgle(左上角,右下角),并且要确定当调用这个方法时,要把原来已经画好的矩形清除掉(或者是根据左上,右下坐标,调整矩形的大小,这样的话,就不用清除原有的矩形)

    在鼠标左键按下事件中,获取鼠标位置,保存为左上角坐标,设置开始画矩形的一个标志
    在鼠标左键弹起事件中,恢复划矩形的标志为false
    在鼠标移动事件中,需要判断是否同时还按下了鼠标左键,如果按下了,并且画矩形标志为true,就获取鼠标位置,保存为右下角坐标(针对鼠标向左上移动的场合,要把左上,右下位置交换一下),然后画一个矩形

    // css部分
    #canvas {
    		background-color: #AAAAAA;
    		position: relative;
    		background-size:100% 100%;
    		border: 2px solid blue;
    	}
     
    #canvas>div {
    		border: 2px solid green;
    		position: absolute;
    		background-color: #eaeaea;
    	}
    #canvas>div>span {
    		position: absolute;
    		top: 50%;
    		left: 50%;
    		transform: translate(-50%, -50%);
    		font-family: simsun;
    		font-size: 9pt;
    	}
     
     
    // html部分
    <div id="canvas" style="width:850px;height:477px"></div>
     
    // js部分
    var canvasWidth= 850;
    var canvasHeight = 477;
    var allDivNum = 1;
    CanvasExt = {
    		drawRect: function(canvas) {//参数canvas--所画素材框的区域
    			var that = this;
     
    			// canvas 的矩形框
    			var canvasRect = canvas.getBoundingClientRect();
    			// 矩形框的左上角坐标
    			var canvasLeft = canvasRect.left;
    			var canvasTop = canvasRect.top;
    			var x = 0;
    			var y = 0;
     
    			// 鼠标点击按下事件,画图准备
    			$(document).on('mousedown', '#canvas', function(e) {
    				// 解决修改时已存在素材框等,删除后再新增存在id重复问题
    				var date = new Date().getTime();
    				var id = "newDiv" + date + parseInt(Math.random()*10);
    				
    				var divEle = "";
    				// x y为鼠标的落点
    				x = e.clientX - canvasLeft;
    				y = e.clientY - canvasTop;
    				
    				//创建div
    				divEle = document.createElement('div');
    				divEle.setAttribute("id", id);
     
    				canvas.append(divEle)
    				divEle.style.top = y + "px";
    				divEle.style.left = x + "px";
    				
    				// 绑定删除操作
    				var menu = new BootstrapMenu('#' + id, {
    					actions: [{
    						name: '删除展示框',
    						onClick: function() {
    							del(id);
    						}
    					}]
    				});
    				var tx = 0;
    				var ty = 0;
    				var twidth = 0;
    				var theight = 0;
     
    				// 添加拖拽操作
    				divEle.onmousedown = function(e) {
    					e.stopPropagation();// 阻止时间冒泡
    					var divEleRect = this.getBoundingClientRect();
    					var divEleLeft = e.clientX - divEleRect.left;
    					var divEleTop = e.clientY - divEleRect.top;
    					
    					this.onmousemove = function(e) {
    						e.stopPropagation();
    						tx = e.clientX - canvasLeft - divEleLeft;
    						ty = e.clientY - canvasTop - divEleTop;
    						// 重新获取当前对象的宽和高
    						twidth = document.getElementById(id).style.width;
    						twidth = parseInt(twidth);
    						theight = document.getElementById(id).style.height;
    						theight = parseInt(theight);
    						// 边界检测
    						if(tx <= 0) {
    							tx = 0;
    							this.style.left = 0 + "px";
    						} else if(tx + twidth > canvasWidth) {
    							tx = canvasWidth - twidth;
    							this.style.left = (canvasWidth - twidth) + "px";
    						} else {
    							this.style.left = tx + "px";
    						}
    						if(ty <= 0) {
    							ty = 0;
    							this.style.top = 0 + "px";
    						} else if((ty + theight) > canvasHeight) {
    							y = canvasHeight - theight;
    							this.style.top = (canvasHeight - theight) + "px";
    						} else {
    							this.style.top = ty + "px";
    						}
    					}
    					this.onmouseup = function(e) {
    						var id = $(this).attr("id");
    						e.stopPropagation();
    						this.onmousemove = null;
    					}
    				};
     
    				//鼠标移动事件,画图
    				var width = 0;
    				var height = 0;
    				canvas.onmousemove = function(e) {
    					e.stopPropagation();
    					// width height是鼠标移动末尾距鼠标起始位置的差值
    					width = e.clientX - canvasLeft - x;
    					height = e.clientY - canvasTop - y;
    					divEle.style.width = width + "px";
    					divEle.style.height = height + "px";
    					
    					var tw = e.clientX - canvasLeft;
    					var th = e.clientY - canvasTop;
    					if(tw >= (parseInt(canvasWidth)-7) || th >=             
                                 (parseInt(canvasHeight)-7)){ // 比canvas少3px,为了易于判断
    						
    							allDivNum++;
    							divEle.innerHTML = "<span>素材框" + allDivNum + "</span>";
    						canvas.onmousemove = null;
    						canvas.onmouseup = null;
    						return;
    					}
    				}
    				canvas.onmouseup = function(e) {
    					if(width < 10 || height < 10) {
    						canvas.removeChild(divEle);
    					} else {
    						allDivNum++;
    						divEle.innerHTML = "<span>素材框" + allDivNum + "</span>";
    					}
    					e.stopPropagation();
    					canvas.onmousemove = null;
    				}
    			});
     
    		}
    	};
    window.onload = function() {
    		var canvas = document.getElementById("canvas");
    		CanvasExt.drawRect(canvas);
    		// 取消默认右击事件
    		document.oncontextmenu = function(e) {
    			e.preventDefault();
    		}
    	};
    

    https://blog.csdn.net/qq_40302859/article/details/81945520

    代码是会有冗余部分,自己改造一下

    右键菜单用到的是BootstrapMenu.min.js

    需要下载的可以移步https://download.csdn.net/download/qq_40302859/10620088

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh" lang="zh">
    <head>
    <title>JS实现用鼠标拖动画出矩形框_网页代码站(www.webdm.cn)</title>
    <style type="text/css">
    body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{margin:0;padding:0}
    html{color:#000;overflow-y:scoll;overflow:-moz-scrollbars-vertical}
    .div{position:absolute; border:1px dashed blue; width:0px; height:0px;left:0px; top:0px; overflow:hidden;}
    .retc{position:absolute; border:1px solid #CCCCCC; overflow:hidden; background:#EFEFEF}
    </style>
    </head>
    <body>	
    </body>
    <script language = "javascript">
    	var wId = "w";
    	var index = 0;
    	var startX = 0, startY = 0;
    	var flag = false;
    	var retcLeft = "0px", retcTop = "0px", retcHeight = "0px", retcWidth = "0px";
    	document.onmousedown = function(e){
    		flag = true;
    		try{
    			var evt = window.event || e;
    			var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    			var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
    			startX = evt.clientX + scrollLeft;
    			startY = evt.clientY + scrollTop;
    			index++;
    			var div = document.createElement("div");
    			div.id = wId + index;
    			div.className = "div";
    			div.style.marginLeft = startX + "px";
    			div.style.marginTop = startY + "px";
    			document.body.appendChild(div);
    		}catch(e){
    		//alert(e);
    		}
    	}
    	document.onmouseup = function(){
    		try{
    			document.body.removeChild($(wId + index));
    			var div = document.createElement("div");
    			div.className = "retc";
    			div.style.marginLeft = retcLeft;
    			div.style.marginTop = retcTop;
    			div.style.width = retcWidth;
    			div.style.height = retcHeight;
    			document.body.appendChild(div);
    		}catch(e){
    			//alert(e);
    		}
    		flag = false;
    	}
    	document.onmousemove = function(e){
    		if(flag){
    			try{
    			var evt = window.event || e;
    			var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    			var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
    			retcLeft = (startX - evt.clientX - scrollLeft > 0 ? evt.clientX + scrollLeft : startX) + "px";
    			retcTop = (startY - evt.clientY - scrollTop > 0 ? evt.clientY + scrollTop : startY) + "px";
    			retcHeight = Math.abs(startY - evt.clientY - scrollTop) + "px";
    			retcWidth = Math.abs(startX - evt.clientX - scrollLeft) + "px";
    			$(wId + index).style.marginLeft = retcLeft;
    			$(wId + index).style.marginTop = retcTop;
    			$(wId + index).style.width = retcWidth;
    			$(wId + index).style.height = retcHeight;
    			}catch(e){
    				//alert(e);
    			}	
    		}
    	}
    	var $ = function(id){
    		return document.getElementById(id);
    	}
    </script>
    <br>
    <p><a href="http://www.webdm.cn">网页代码站</a> - 最专业的网页代码下载网站 - 致力为中国站长提供有质量的网页代码!</p>
    </html>
    

    canvas实现鼠标拖拽矩形移动改变大小

    项目的一个新需求,动态生成矩形框,鼠标点击拖动改变矩形框的位置,并可以调整大小。

    之前做过一个小demo,需求类似,但是在canvas内只有一个矩形框,拖动移动,当时记得是用isPointInPath()直接判断鼠标是否点在了矩形框以内。新需求的矩形框个数为n,经过测试,isPointinPath实现过程中有bug,并不能精准定位到具体点击到canvas的某一个矩形框。经过一系列的头脑风暴,才想出了解决办法,才发现原来是最简单的方法,但是在思考的当初就被pass了,见代码:

    html:

    <body>
      <canvas id="canvas" width="400" height="300">
      </canvas>
    </body>
    

    小demo,不做其他修饰,直接写逻辑吧。

    js:
    第一步,创建一个容器,以保存Canvas内绘制的元素点。Canvas是一种非保留性的绘图界面,即不会记录过去执行的绘图操作,而是保持最终结果(构成图像的彩色像素)。

    如果想让Canvas变得具有交互性,比如用户可以选择、拖动画布上的图形。那么我们必须记录绘制的每一个对象,才能在将来灵活的修改并重绘它们,实现交互。

    // canvas 矩形框集合
        var rects=[];
         function rectar(x,y,width,height){
                this.x = x;
                this.y = y;
                this.width = width;
                this.height = height;
                this.isSelected = false;
            };
    

    绘制矩形框:

    function drawRect() {
          // 清除画布,准备绘制
          context.clearRect(0, 0, canvas.width, canvas.height);
    
          // 遍历所有矩形框
          for(var i=0; i<rects.length; i++) {
            var rect = rects[i];
    
            // 绘制矩形
            context.strokeStyle="#FF0000";
            context.strokeRect(rect.x,rect.y,rect.width,rect.height,rect.color);
    
            if (rect.isSelected) {
              context.lineWidth = 50;
            }
            else {
              context.lineWidth = 10;
            }
          }
        }
    

    这是一个绘制函数,因为在Canvas的所有操作,全部都是重新绘制的(先清除,在绘制),每次程序刷新画布时,会先使用 clearRect() 方法清除画布上的所有内容。但不用当心这样会造成画布闪烁,即画布上的圆圈一下子全部消失,然后一下子又重新出现。因为Canvas针对这个问题进行了优化,会在所有绘图逻辑执行完毕后才清除或绘制所有内容,保证最终结果的流畅。然后遍历矩形数组 其中的x,y,width,height来画矩形。

    *这里我的项目是根据病变位置动态生成的矩形框,每一次生成矩形框,都要把它的位置信息添加到数组中,这里就直接创建矩形框了,可以根据自己需求改造

    function addRandomRect() {
         var x=10;
         var y=10;
         var width=100;
         var height=100;
          // 创建一个新的矩形对象
          var rect=new rectar(x,y,width,height);
    
          // 把它保存在数组中
          rects.push(rect);
          // 重新绘制画布
         drawRect();
     };
    

    *Canvas点击事件

    var SelectedRect;
        var x1;
        var y1;
        var right=false;
        var widthstart,widthend;
        var heightstart,heightend;
    
    function canvasClick(e) {
          // 取得画布上被单击的点
          var clickX = e.pageX - canvas.offsetLeft;
          var clickY = e.pageY - canvas.offsetTop;
    
          // 查找被单击的矩形框
          for(var i=rects.length-1; i>=0; i--) {
            var rect = rects[i];
    
                widthstart=rect.x;
                widthend=rect.x+rect.width;
    
                heightstart=rect.y;
                heightend=rect.y+rect.height;
    
            // 判断这个点是否在矩形框中
            if ((clickX>=widthstart&&clickX<(widthend-20))&&(clickY>=heightstart)&&(clickY<(heightend-20))) {
              console.log(clickX);
              // 清除之前选择的矩形框
              if (SelectedRect != null) SelectedRect.isSelected = false;
              SelectedRect = rect;
              x1=clickX-SelectedRect.x;
              y1=clickY-SelectedRect.y;
              //选择新圆圈
              rect.isSelected = true;
    
              // 使圆圈允许拖拽
              isDragging = true;
    
              //更新显示
              drawRect();
              //停止搜索
              return;
            };
            /*
              设置拉伸的界限。
              */
           // if ((clickX>=(widthend-20))&&(clickY>=(heightend-20)))
           // {
           //   SelectedRect = rect;
           //  right=true;
           //  }
              //18-02-01改
    
                if ((clickX>=(widthend-20)&&((clickX<=(widthend+20)))&&(clickY>=(heightend-20))&&(clickY>=(heightend+20))) 
                 {
                 SelectedRect = rect;
                  right=true; 
                  }
      } 
    }
    

    代码中23行为判断具体点击哪个元素的语句,其实很简单,当初绕了很久,很简单直接判断鼠标点击点是否在矩形框之内即可,无论是哪个矩形框,只要在矩形框之内,就把当前矩形框设置为点击的矩形框。29行判断鼠标点击点相对于矩形框的位置。42-49行,是鼠标拉伸改变大小的判断,可以设置矩形四个角拉伸,但我认为太复杂了,只保留了右下角拉伸的点击判断,操作更简单一些。

    响应事件:

    function dragRect(e) {
          // 判断矩形是否开始拖拽
          if (isDragging == true) {
            // 判断拖拽对象是否存在
            if (SelectedRect != null) {
              // 取得鼠标位置
              var x = e.pageX - canvas.offsetLeft;
              var y = e.pageY - canvas.offsetTop;
              // 将圆圈移动到鼠标位置
              SelectedRect.x= x-x1;
              SelectedRect.y= y-y1;
    
             // 更新画布
             drawRect();
            }
          }
          //判断是否开始拉伸
          if (right) {
          //设置拉伸最小的边界
            if ((e.pageX - canvas.offsetLeft-SelectedRect.x)>50) {
               SelectedRect.width=e.pageX - canvas.offsetLeft-SelectedRect.x;
            }
            else {
              SelectedRect.width=50;
            }
           console.log(SelectedRect.width);
           if((e.pageY - canvas.offsetTop-SelectedRect.y)>50){
             SelectedRect.height=e.pageY - canvas.offsetTop-SelectedRect.y;
    
           }
           else {
             SelectedRect.height=50;
           }
            drawRect();
          }
        };
    

    以上就完成了对矩形框的基本操作,然后添加onmouseup的函数和调用函数:

    var isDragging = false;
        function stopDragging() {
          isDragging = false;
          right=false;
        };
       function clearCanvas() {
         // 去除所有矩形
          rects = [];
        // 重新绘制画布.
        drawCircles();
        }
    
      window.onload = function() {
          canvas = document.getElementById("canvas");
          context = canvas.getContext("2d");
          canvas.onmousedown = canvasClick;
          canvas.onmouseup = stopDragging;
          canvas.onmouseout = stopDragging;
          canvas.onmousemove =dragRect;
    ; };
    
    展开全文
  • 鼠标事件的事件源往往与容器相关,鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口。MouseListener...

    鼠标事件的事件源往往与容器相关,当鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口。

    MouseListener接口

    MouseListener接口能处理5种鼠标事件:按下鼠标,释放鼠标,点击鼠标、鼠标进入、鼠标退出。相应的方法有:

    (1) getX():鼠标的X坐标

    (2) getY():鼠标的Y坐标

    (3) getModifiers():获取鼠标的左键或右键。

    (4) getClickCount():鼠标被点击的次数。

    (5) getSource():获取发生鼠标的事件源。

    (6) addMouseListener(监视器):加放监视器。

    (7) removeMouseListener(监视器):移去监视器。

    要实现的MouseListener接口的方法有:

    (1) mousePressed(MouseEvent e);

    (2) mouseReleased(MouseEvent e);

    (3) mouseEntered(MouseEvent e);

    (4) mouseExited(MouseEvent e);

    (5) mouseClicked(MouseEvent e);

    【例】小应用程序设置了一个文本区,用于记录一系列鼠标事件。当鼠标进入小应用程序窗口时,文本区显示“鼠标进来”;当鼠标离开 窗口时,文本区显示“鼠标走开”;当鼠标被按下时,文本区显示“鼠标按下”,当鼠标被双击时,文本区显示“鼠标双击”;并显示鼠标的坐标。程序还显示一个红色的圆,当点击鼠标时,圆的半径会不断地变大。

    import java.applet.*;

    import javax.swing.*;

    import java.awt.*;

    import java.awt.event.*;

    class MyPanel extends JPanel{

    public void print(int r){

    Graphics g = getGraphics();

    g.clearRect(0,0,this.getWidth(),this.getHeight());

    g.setColor(Color.red);

    g.fillOval(10,10,r,r);

    }

    }

    class MyWindow extends JFrame implements MouseListener{

    JTextArea text;

    MyPanel panel;

    int x,y,r =10;

    int mouseFlg=0;

    static String mouseStates[]={"鼠标键按下","鼠标松开","鼠标进来","鼠标走开","鼠标双击"};

    MyWindow(String s){

    super(s);

    Container con = this.getContentPane();

    con.setLayout(new GridLayout(2,1));

    this.setSize(200,300);

    this.setLocation(100,100);

    panel = new MyPanel();

    con.add(panel);

    text = new JTextArea(10,20);

    text.setBackground(Color.blue);

    con.add(text);

    addMouseListener(this);

    this.setVisible(true);

    this.pack();

    }

    public void paint(Graphics g){

    r = r+4;

    if(r>80){

    r=10;

    }

    text.append(mouseStates[mouseFlg]+"了,位置是:" +x+","+y+"\n");

    panel.print(r);

    }

    public void mousePressed(MouseEvent e){

    x = e.getX();

    y = e.getY();

    mouseFlg = 0;

    repaint();

    }

    public void mouseRelease(MouseEvent e){

    x = e.getX();

    y = e.getY();

    mouseFlg = 1;

    repaint();

    }

    public void mouseEntered(MouseEvent e){

    x = e.getX();

    y = e.getY();

    mouseFlg = 2;

    repaint();

    }

    public void mouseExited(MouseEvent e){

    x = e.getX();

    y = e.getY();

    mouseFlg = 3;

    repaint();

    }

    public void mouseClicked(MouseEvent e){

    if(e.getClickCount()==2){

    x = e.getX();

    y = e.getY();

    mouseFlg = 4;

    repaint();

    }

    else{}

    }

    }

    public class Example6_8 extends Applet{

    public void init(){

    MyWindow myWnd = new MyWindow("鼠标事件示意程序");

    }

    }

    任何组件上都可以发生鼠标事件:鼠标进入、鼠标退出、按下鼠标等。例如,在上述程序中添加一个按钮,并给按钮对象添加鼠标监视器,将上述程序中的init()方法修改成如下形式,即能示意按钮上的所有鼠标事件。

    JButton button;

    public void init(){

    button = new JButton(“按钮也能发生鼠标事件”);

    r = 10;

    text = new JTextArea(15,20);

    add(button);

    add(text);

    button.addMouseListener(this);

    }

    如果程序希望进一步知道按下或点击的是鼠标左键或右键,鼠标的左键或右键可用InputEvent类中的常量BUTTON1_MASK和BUTTON3_MASK来判定。例如,以下表达式判断是否按下或点击了鼠标右键:

    e.getModifiers()==InputEvent. BUTTON3_MASK

    MouseMotionListener接口

    MouseMotionListener接口处理拖动鼠标和鼠标移动两种事件。

    注册监视器的方法是:

    addMouseMotionListener(监视器)

    要实现的的接口方法有两个:

    (1) mouseDragged(MouseEvent e)

    (2) mouseMoved(MouseEvent e)

    【例】一个滚动条与显示窗口同步变化的应用程序。窗口有一个方块,用鼠标拖运方块,或用鼠标点击窗口,方块改变显示位置,相应水平和垂直滚动条的滑块也会改变它们在滚动条中的位置。反之,移动滚动条的滑块,方块在窗口中的显示位置也会改变。

    import javax.swing.*;

    import java.awt.*;

    import java.awt.event.*;

    class MyWindow extends JFrame{

    public MyWindow(String s){

    super(s);

    Container con = this.getContentPane();

    con.setLayout(new BorderLayout());

    this.setLocation(100,100);

    JScrollBar xAxis = new JScrollBar(JScrollBar.HORIZONTAL,50,1,0,100);

    jScrollBar yAxis = new jScrollBar(JScrollBar.VERTICAL,50,1,0,100);

    MyListener listener = new MyListener(xAxis,yAxis,238,118);

    Jpanel scrolledCanvas = new JPanel();

    scrolledCanvas.setLayout(new BorderLayout());

    scrolledCanvas.add(listener,BorderLayout.CENTER);

    scrolledCanvas.add(xAix,BorderLayout.SOUTH);

    scrolledCanvas.add(yAix,BorderLayout.EAST);

    con.add(scrolledCanvas,BorderLayout.NORTH);

    this.setVisible(true);

    this.pack();

    }

    public Dimension getPreferredSize(){

    return new Dimension(500,300);

    }

    }

    class MyListener extends JComponent implements MouseListener, MouseMotionListener,AdjustmentListener{

    private int x,y;

    private JScrollBar xScrollBar;

    private JScrollBar yScrollBar;

    private void updateScrollBars(int x,int y){

    int d;

    d = (int)(((float)x/(float)getSize().width)*100.0);

    xScrollBar.setValue(d);

    d = (int)(((float)y/(float)getSize().height)*100.0);

    yScrollBar.setValue(d);

    }

    public MyListener(JScrollBar xaxis,JScrollBar yaxis,int x0,int y0){

    xScrollBar =xaxis;

    yScrollBar =yaxis;

    x = x0;

    y=y0;

    xScrollBar.addAdjustmentListener(this);

    yScrollBar.addAdjustmentListener(this);

    this.addMouseListener(this);

    this.addMouseMotionListener(this);

    }

    public void paint(Graphics g){

    g.setColor(getBackground());

    Dimension size = getSize();

    g.fillRect(0,0,size.width,size.height);

    g.setColor(Color.blue);

    g.fillRect(x,y,50,50);

    }

    public void mouseEntered(MouseEvent e){}

    public void mouseExited(MouseEvent e){}

    public void mouseClicked(MouseEvent e){}

    public void mouseRelease(MouseEvent e){}

    public void mouseMoved(MouseEvent e){}

    public void mousePressed(MouseEvent e){

    x = e.getX();

    y = e.getY();

    updateScrollBars(x,y);

    repaint();

    }

    public void mouseDragged(MouseEvent e){

    x = e.getX();

    y = e.getY();

    updateScrollBars(x,y);

    repaint();

    }

    public void adjustmentValueChanged(AdjustmentEvent e){

    if(e.getSource()==xScrollBar)

    x=(int)((float)(xScrollBar.getValue()/100.0)*getSize().width);

    else if(e.getSource()==yScrollBar)

    y = (int)((float)(yScrollBar.getValue()/100.0)*getSize().height);

    repaint();

    }

    }

    public class Example6_9{

    public static void main(){

    MyWindow myWindow = new MyWindow("滚动条示意程序");

    }

    }

    上述例子中,如果只要求通过滑动滑块,改变内容的显示位置,可以简单地使用滚动面板JScrollPane。如果是这样,关于滚动条的创建和控制都可以免去,直接由JScrollPane内部实现。参见以下修改后的MyWindow的定义:

    class MyWindow extends JFrame{

    public MyWindow(String s){

    super(s);

    Container con = this.getContentPane();

    con.setLayout(new BorderLayout());

    this.setLocaltion(100,100);

    MyListener listener = new MyListener();

    listener.setPreferredSize(new Dimension(700,700));

    JScrollPane scrolledCanvas = new JScrollPane(listener);

    this.add(scrolledCanvas,BorderLayout.CENTER);

    this.setVisible(true);

    this.pack();

    }

    public Dimension getPreferredSize(){

    return new Dimension(400,400);

    }

    }

    鼠标指针形状也能由程序控制 ,setCursor()方法能设置鼠标指针形状。例如,代码setCursor(Cursor.getPredefinedCursor(cursor.WAIT_CURSOR))。

    展开全文
  • Java鼠标事件

    千次阅读 2018-02-06 16:49:41
    鼠标事件的事件源往往与容器相关,鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口。 ...
    鼠标事件的事件源往往与容器相关,当鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口。
    

    MouseListener接口

    MouseListener接口能处理5种鼠标事件:按下鼠标,释放鼠标,点击鼠标、鼠标进入、鼠标退出。相应的方法有:
    (1) getX():鼠标的X坐标
    (2) getY():鼠标的Y坐标
    (3) getModifiers():获取鼠标的左键或右键。
    (4) getClickCount():鼠标被点击的次数。
    (5) getSource():获取发生鼠标的事件源。
    (6) addMouseListener(监视器):加放监视器。
    (7) removeMouseListener(监视器):移去监视器。

    要实现的MouseListener接口的方法有:
    (1) mousePressed(MouseEvent e);
    (2) mouseReleased(MouseEvent e);
    (3) mouseEntered(MouseEvent e);
    (4) mouseExited(MouseEvent e);
    (5) mouseClicked(MouseEvent e);

    【例 11-18】小应用程序设置了一个文本区,用于记录一系列鼠标事件。当鼠标进入小应用程序窗口时,文本区显示“鼠标进来”;当鼠标离开 窗口时,文本区显示“鼠标走开”;当鼠标被按下时,文本区显示“鼠标按下”,当鼠标被双击时,文本区显示“鼠标双击”;并显示鼠标的坐标。程序还显示一个红色的圆,当点击鼠标时,圆的半径会不断地变大(查看源文件)。

    任何组件上都可以发生鼠标事件:鼠标进入、鼠标退出、按下鼠标等。例如,在上述程序中添加一个按钮,并给按钮对象添加鼠标监视器,将上述程序中的init()方法修改成如下形式,即能示意按钮上的所有鼠标事件。
    JButton button;
    public void init(){
        button = new JButton(“按钮也能发生鼠标事件”);
        r = 10;
        text = new JTextArea(15,20);
        add(button);
        add(text);
        button.addMouseListener(this);
    }

    如果程序希望进一步知道按下或点击的是鼠标左键或右键,鼠标的左键或右键可用InputEvent类中的常量BUTTON1_MASK和BUTTON3_MASK来判定。例如,以下表达式判断是否按下或点击了鼠标右键:
        e.getModifiers()==InputEvent. BUTTON3_MASK

    MouseMotionListener接口

    MouseMotionListener接口处理拖动鼠标和鼠标移动两种事件。

    注册监视器的方法是:
        addMouseMotionListener(监视器)
    要实现的的接口方法有两个:
    (1) mouseDragged(MouseEvent e)
    (2) mouseMoved(MouseEvent e)

    【例 11-19】一个滚动条与显示窗口同步变化的应用程序。窗口有一个方块,用鼠标拖运方块,或用鼠标点击窗口,方块改变显示位置,相应水平和垂直滚动条的滑块也会改变它们在滚动条中的位置。反之,移动滚动条的滑块,方块在窗口中的显示位置也会改变(查看源文件)。

    上述例子中,如果只要求通过滑动滑块,改变内容的显示位置,可以简单地使用滚动面板JScrollPane。如果是这样,关于滚动条的创建和控制都可以免去,直接由JScrollPane内部实现。参见以下修改后的MyWindow的定义:
    class MyWindow extends JFrame{
        public MyWindow(String s){
            super(s);
            Container con = this.getContentPane();
            con.setLayout(new BorderLayout());
            this.setLocaltion(100,100);
            MyListener listener = new MyListener();
            listener.setPreferredSize(new Dimension(700,700));
            JScrollPane scrolledCanvas = new JScrollPane(listener);
            this.add(scrolledCanvas,BorderLayout.CENTER);
            this.setVisible(true);
            this.pack();
        }
        public Dimension getPreferredSize(){
            return new Dimension(400,400);
        }
    }
    鼠标指针形状也能由程序控制 ,setCursor()方法能设置鼠标指针形状。例如,代码setCursor(Cursor.getPredefinedCursor(cursor.WAIT_CURSOR))。
    展开全文
  • 鼠标事件的事件源往往与容器相关,鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口。 ...
  • 鼠标事件的事件源往往与容器相关,鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口。 MouseListener...
  • 当点击鼠标或者拖动鼠标时,触发的事件是下列的哪一个?() A.KeyEvent B.AxtionEvent C.ItemEvent D.MouseEvent 答案:D 触发ActionEvent这个事件的动作有: 1.点击按钮。 2.双击列表中选项。 3.选择菜单项。 4.在...
  • 鼠标事件的事件源往往与容器相关,鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口。 MouseListener...
  • QMouseEvent类用于表示一个鼠标事件,按下鼠标或者移动鼠标时就会产生鼠标事件,利用QMouseEvent类可以获取鼠标时哪个键给按下了 QWheelEvent类用于表示鼠标滚轮事件,在这个类中主要是获取滚轮移动的方向和距离 ...
  • 每日刷题Day_3

    2018-10-10 19:55:38
    1.当点击鼠标或者拖动鼠标时,触发的事件是下列的哪一个?() 正确答案: D 你的答案: D (正确) A.KeyEvent B.AxtionEvent C.ItemEvent D.MouseEvent 2.下列有关NAT叙述错误的是( ) 正确答案: C 你的答案: C ...
  • 表格很大,为了方便观察数据,需要固定首行或者前几行;首列或者前几列;或者几行几列同时固定。固定了的行或列,不随拖动滚动。我们在WPS2019中以下表为例,演示如何冻结窗格?1.首先演示:怎样冻结首行或首列...
  • 表格很大,为了方便观察数据,需要固定首行或者前几行;首列或者前几列;或者几行几列同时固定。固定了的行或列,不随拖动滚动。我们在WPS2019中以下表为例,演示如何冻结窗格?1.首先演示:怎样冻结首行或首列...
  • 知识回顾:当鼠标在窗口内移动,点击或者释放都会产生WM_NCHITTEST消息,响应函数OnNcHitTest会返回一个枚举值,系统会根据这个枚举值进行相应的处理。返回值为HTCAPTION,系统会认为此时鼠标位于标题栏上,因而...
  • mfc任意位置实现窗口拖动

    千次阅读 2013-06-01 12:11:53
     当鼠标在窗口内移动,点击或者释放都会产生WM_NCHITTEST消息,响应函数OnNcHitTest会返回一个枚举值,mfc会根据这个枚举值进行相应的处理  返回值为HTCAPTION,mfc会认为此时鼠标位于标题栏上,因而当鼠标按下...
  • MFC任意位置实现窗口拖动

    千次阅读 2015-07-02 18:17:45
     当鼠标在窗口内移动,点击或者释放都会产生WM_NCHITTEST消息,响应函数OnNcHitTest会返回一个枚举值,mfc会根据这个枚举值进行相应的处理。 返回值为HTCAPTION,MFC会认为此时鼠标位于标题栏上,因而当鼠标按下...
  • 基础知识:鼠标在窗口内移动,点击或者释放都会产生WM_NCHITTEST消息,响应函数OnNcHitTest会返回一个枚举值,系统会根据这个枚举值进行相应的处理。返回值为HTCAPTION,系统会认为此时鼠标位于标题栏上,因而...
  •  当鼠标在窗口内移动,点击或者释放都会产生WM_NCHITTEST消息,响应函数OnNcHitTest会返回一个枚举值,mfc会根据这个枚举值进行相应的处理。 返回值为HTCAPTION,MFC会认为此时鼠标位于标题栏上,因而当鼠标按下...
  • 转载:http://www.cnblogs.com/XiHua/articles/3490490.html ... 知识回顾:  当鼠标在窗口内移动,点击或者释放都会产生WM_NCHITTEST消息,响应函数OnNcHitTest会返回一个枚举值,系统会根据这个枚举值...
  • html5 拖放

    2018-07-11 19:09:45
    拖放事件H5的拖放事件提供了多个接口:1、drag:元素或者选中的文本被拖动时触发(每几百毫秒触发一次),应用在被拖拽元素上2、dragend:当拖动操作结束触发(通过释放鼠标按钮或者点击转义键),应用在被拖拽...
  • H5 拖放事件详解

    2017-01-13 11:25:00
    2、dragend:当拖动操作结束触发(通过释放鼠标按钮或者点击转义键),应用在被拖拽元素上 3、dragenter:一个被拖动的元素或者选中的文本进入一个有效的放置目标触发,应用在目标元素上 4、dragexit:...
  • js拖拽

    2010-08-17 15:52:00
    (1)在拖放对象上点击按钮,并开始移动鼠标时,在拖动对象上触发dragstart事件,默认情况下这个事件是在图像或者被选中的文本上. (2)当拖动时鼠标形状变成不能放置符号(圈圈中有条线).如下图 (3)鼠标一直拖着不放...
  • 2、dragend:当拖动操作结束触发(通过释放鼠标按钮或者点击转义键),应用在被拖拽元素上 3、dragenter:一个被拖动的元素或者选中的文本进入一个有效的放置目标触发,应用在目标元素上 4、...
  • JAVA第七次作业

    2017-05-11 10:52:00
    (一)学习总结 1.写出事件处理模型中的几个关键词,并通过具体代码实例说明你对事件处理模型的理解。 ActionEvent 通常在按下按钮,在文本框中...MouseEvent 当鼠标拖动、移动、点击、按下.. TextEvent 文本区...
  • 3dMax常见问题

    2017-07-15 01:02:00
    调整右侧命令面板的位置鼠标放在命令面单顶部,显示两个长方形,可以鼠标左键拖动。 命令面板拖动后可以停靠到指定地方,或者双击顶部回到原位。 调整界面视口- 界面左下角的四个方框,即默认是四个视口。 - ...

空空如也

空空如也

1 2 3 4
收藏数 69
精华内容 27
关键字:

当点击鼠标或者拖动鼠标时