📄 drawbymouse.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class DrawByMouse
{
public static void main(String[] args)
{
MouseFrame frame = new MouseFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
class MouseFrame extends JFrame
{
public MouseFrame()
{
setTitle("利用鼠标画图");
setSize(WIDTH, HEIGHT);
// 将panel加入到frame
MousePanel panel = new MousePanel();
Container contentPane = getContentPane();
contentPane.add(panel);
}
public static final int WIDTH = 800;
public static final int HEIGHT = 600;
}
class MousePanel extends JPanel
{
public MousePanel()
{
startfaces=new ArrayList();
endfaces=new ArrayList();
facetypes=new ArrayList();
points=new ArrayList();
JButton button1=new JButton("画直线");
JButton button2=new JButton("画矩形");
JButton button3=new JButton("画椭圆");
JButton button4=new JButton("自由绘图");
ButtonAction action1=new ButtonAction(1);
ButtonAction action2=new ButtonAction(2);
ButtonAction action3=new ButtonAction(3);
ButtonAction action4=new ButtonAction(4);
button1.addActionListener(action1);
button2.addActionListener(action2);
button3.addActionListener(action3);
button4.addActionListener(action4);
add(button1);
add(button2);
add(button3);
add(button4);
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
//do something for drawing;
int xx1=0,yy1=0,xx2=0,yy2=0;//用于显示即时图像
int i=0,j=0;//用于循环
//显示即时图像
//判断起点是否大于终点,用于显示即时图像
if(x1>x2)
{
xx1=x2;
xx2=x1;
}
else
{
xx1=x1;
xx2=x2;
}
if(y1>y2)
{
yy1=y2;
yy2=y1;
}
else
{
yy1=y1;
yy2=y2;
}
if(clickid==1)
{
g.drawLine(x1,y1,x2,y2);
}
else if(clickid==2)
{
g.drawRect(xx1,yy1,xx2-xx1,yy2-yy1);
}
else if(clickid==3)
{
g.drawOval(xx1,yy1,xx2-xx1,yy2-yy1);
}
//显示所有图像
for(i=0;i<endfaces.size();i++)
{
String type=(String)facetypes.get(i);
xx1=startPointX=((Point)startfaces.get(i)).x;
yy1=startPointY=((Point)startfaces.get(i)).y;
xx2=endPointX=((Point)endfaces.get(i)).x;
yy2=endPointY=((Point)endfaces.get(i)).y;
if(startPointX>endPointX)
{
xx1=endPointX;
xx2=startPointX;
}
if(startPointY>endPointY)
{
yy1=endPointY;
yy2=startPointY;
}
if(type.equals("line"))
{
//draw rectanges;
g.drawLine(startPointX,startPointY,endPointX,endPointY);
}
else if(type.equals("rect"))
{
//draw lines;
g.drawRect(xx1,yy1,xx2-xx1,yy2-yy1);
}
else if(type.equals("circle"))
{
//draw circles;
g.drawOval(xx1,yy1,xx2-xx1,yy2-yy1);
}
}
for(j=0;j<points.size()-1;j++)
{
if(((Point)points.get(j))==null||((Point)points.get(j+1))==null)
{
continue;
}
startPointX=((Point)points.get(j)).x;
startPointY=((Point)points.get(j)).y;
endPointX=((Point)points.get(j+1)).x;
endPointY=((Point)points.get(j+1)).y;
g.drawLine(startPointX,startPointY,endPointX,endPointY);
}
}
private class ButtonAction implements ActionListener//按钮监视器
{
public ButtonAction(int i)
{
_clickid = i;
}
public void actionPerformed(ActionEvent event)//按下按钮执行的动作
{
clickid=_clickid;
}
private int _clickid;
}
private class MouseHandler extends MouseAdapter//鼠标适配器
{
public void mousePressed(MouseEvent event)//单击鼠标执行的动作
{
//set something;
Point point=new Point();
point.x=event.getX();
point.y=event.getY();
String type="";
if(clickid==4)
{
points.add(point);//保存点
}
else
{
if(clickid==1)
{
type="line";
}
else if(clickid==2)
{
type="rect";
}
else if(clickid==3)
{
type="circle";
}
x1=event.getX();
y1=event.getY();
startfaces.add(point);
facetypes.add(type);//保存点之外的其它类型
}
}
public void mouseReleased(MouseEvent event)//松开鼠标执行的动作
{
//set something;
Point point=new Point();
if(clickid==4)
{
point=null;
points.add(point);
}
else
{
point.x=event.getX();
point.y=event.getY();
endfaces.add(point);
}
repaint();
}
}
private class MouseMotionHandler implements MouseMotionListener//鼠标监视器
{
public void mouseMoved(MouseEvent event)//移动鼠标执行的动作
{
//set something;
}
public void mouseDragged(MouseEvent event)//拖动鼠标执行的动作
{
//set something;
if(clickid==4)
{
Point point=new Point();
point.x=event.getX();
point.y=event.getY();
points.add(point);
}
else
{
x2=event.getX();
y2=event.getY();
}
repaint();
}
}
private int clickid=0;//按钮id
private int startPointX=0;//起点X
private int startPointY=0;//起点Y
private int endPointX=0;//终点X
private int endPointY=0;//终点Y
private ArrayList startfaces;//起点列表
private ArrayList endfaces;//终点列表
private ArrayList facetypes;//类型列表
private ArrayList points;
private int x1=0;
private int y1=0;
private int x2=0;
private int y2=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -