鼠标画线汇集代码

本文对比分析了三种使用Java绘制鼠标线条的方法。第一种方法使线随着鼠标的拖动实时更新;第二种方法记录起点和终点,在鼠标释放时一次性绘制;第三种方法采用点列表来跟踪并绘制连续的线段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

搜罗了网友几种点击鼠标画线的代码,初学swing,表示不懂第一种和第二种为何有这么大区别。留下以后解决

一、鼠标到哪,线跟着画到哪里

//借用别人的代码

import java.awt.*;

import java.awt.event.*;
public class TestMouseKey extends Frame {

int startX,startY,endX,endY;

TestMouseKey() {

  final Frame f = new Frame("FRAME");

  f.addMouseListener(new MouseAdapter(){
    public void mousePressed(MouseEvent e){
    startX = e.getX();
    startY = e.getY();

  }  

    public void mouseReleased(MouseEvent e){

//    Graphics g = f.getGraphics();
    endX = e.getX();
    endY = e.getY();
//    g.drawLine(startX,startY,endX,endY);
   } 

});


  f.addMouseMotionListener(new MouseAdapter(){
    public void mouseDragged(MouseEvent e){
    endX = e.getX();
    endY = e.getY();
    f.getGraphics().drawLine(startX,startY,endX,endY);
    startX=endX;
    startY=endY;
   }
  });


  f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
        System.exit(0);
    }
      });
   f.setSize(300,400);
   f.setVisible(true);
}

public static void main(String args[]){
  new TestMouseKey();
}

}

二、鼠标点完了才画出线

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MouseDemo extends JFrame implements MouseListener,MouseMotionListener {
int flag; //flag=1代表Mouse Moved,flag=2代表Mouse Dragged
int x = 0;
int y = 0;
int startx, starty, endx, endy;//起始坐标与终点坐标
public MouseDemo() {
Container contentPane = getContentPane();
contentPane.addMouseListener(this);
contentPane.addMouseMotionListener(this);
setSize(300, 300);
show();
addWindowListener(new WindowAdapter() {
 public void windowClosing(WindowEvent e) {
 System.exit(0);
 }
});
}
/*由mousePressed(),mouseReleased()取得鼠标拖曳的开始与结束坐标*/
public void mousePressed(MouseEvent e) {
if(flag==3){
flag=4;
endx = e.getX();
endy = e.getY();
repaint();
}
else{
flag=1;
startx = e.getX();
starty = e.getY();
}

}
public void mouseReleased(MouseEvent e) {
if(flag==1){
flag=2;
endx = e.getX();
endy = e.getY();
repaint();
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
/*mouseMoved(),mouseDragged()取得鼠标移动的每一个坐标,并调用repaint()方法*/
public void mouseMoved(MouseEvent e) {
if(flag ==2){
flag=3;
endx = e.getX();
endy = e.getY();
repaint();
}
}
public void mouseDragged(MouseEvent e) {
// if(flag ==2){
// flag=3;
// endx = e.getX();
// endy = e.getY();
// repaint();
// }
}
public void update(Graphics g) {
g.setColor(this.getBackground());
g.fillRect(0, 0, getWidth(), getHeight()); //清除当前的窗口内容
paint(g);
}
public void paint(Graphics g) {
g.setColor(Color.black);
if (flag == 4) {
//  g.drawString("鼠标坐标:(" + x + "," + y + ")", 10, 50);
 g.drawLine(startx, starty, endx, endy);
}
if (flag == 9) {
//  g.drawString("拖曳鼠标价坐标:(" + x + "," + y + ")", 10, 50);
 g.drawLine(startx, starty, x, y);
}
}
public static void main(String[] args) {
new MouseDemo();
}
}

三、正常的一种情况,画直线-鼠标释放拖拽

import java.util.ArrayList;
import javax.swing.*;
import java.awt.*;
import java.awt.Point;
import java.awt.event.*;
public class Linepanel extends JPanel
{
       private Point point1=null,point2=null;
       private ArrayList<Point> pointlist;
       public Linepanel()
      {
            pointlist=new ArrayList<Point>();
            Linelistener listener=new Linelistener();
            addMouseListener(listener);
            addMouseMotionListener(listener);
            setBackground(Color.black);
            setPreferredSize(new Dimension(400,200));
       }
       public void paintComponent(Graphics page)
      { 
            super.paintComponent(page);
            page.setColor(Color.yellow);
            if(pointlist.size()>=2)
           {
                 for(int i=1;i<pointlist.size();i++)
                      {
                          page.drawLine(pointlist.get(i-1).x,pointlist.get(i-1).y,pointlist.get(i).x,pointlist.get(i).y);
                          point1=pointlist.get(i);
                        }
           }
           if(point1!=null && point2!=null)
          {
                 page.drawLine(point1.x,point1.y,point2.x,point2.y);
           }
      }
      private class Linelistener implements MouseListener,MouseMotionListener
     {
           public void mousePressed(MouseEvent event)
           {
                 point1=event.getPoint();
                 pointlist.add(point1);
            }
public void mouseDragged(MouseEvent event){}
public void mouseClicked(MouseEvent event){}
public void mouseReleased(MouseEvent event){}
public void mouseEntered(MouseEvent event){}
public void mouseExited(MouseEvent event){}
       public void mouseMoved(MouseEvent event){
            point2=event.getPoint();
            repaint();
           }
     }
      public static void main(String[] arg)
      {
          JFrame frame=new JFrame("Draw lines");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          Linepanel pane=new Linepanel();
          frame.getContentPane().add(pane);
          frame.pack();
          frame.setVisible(true);
      }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值