📄 mydraw.java
字号:
import java.lang.*;
import java.awt.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
public class mydraw implements ItemListener
{
static int a=1,b=1,c=1;
JFrame fr=null; //定义框架
JPanel pa1=null; //定义4个面板
JPanel pa2=null;
JPanel pa3=null;
JPanel pa4=null;
JToggleButton tb1=null; //定义6个画图按钮
JToggleButton tb2=null;
JToggleButton tb3=null;
JToggleButton tb4=null;
JToggleButton tb5=null;
JToggleButton tb6=null;
JRadioButton rb1=null; //定义5个颜色按钮
JRadioButton rb2=null;
JRadioButton rb3=null;
JRadioButton rb4=null;
JRadioButton rb5=null;
JRadioButton rb6=null; //定义2个填充按钮
JRadioButton rb7=null;
public mydraw() //构造函数
{
fr=new JFrame("画图");
Container pp=fr.getContentPane(); //定义容器对象
pp.setLayout(new FlowLayout()); //框架布局
rb1=new JRadioButton("黑色",true); // 定义颜色单选钮
rb2=new JRadioButton("红色");
rb3=new JRadioButton("橙色");
rb4=new JRadioButton("蓝色");
rb5=new JRadioButton("绿色");
rb6=new JRadioButton("不填充",true);
rb7=new JRadioButton("填充");
tb1=new JToggleButton("直线",true); //定义图形按钮
tb2=new JToggleButton("矩形");
tb3=new JToggleButton("圆矩形");
tb4=new JToggleButton("椭圆");
tb5=new JToggleButton("圆");
tb6=new JToggleButton("圆弧");
CanvasDraw can;
can=new CanvasDraw(); //定义画布can
pa1=new JPanel(); // 创建面板1对象 并把画布加进去
pa1.add(can);
pa2=new JPanel(); // 创建面板2对象 并把颜色单选钮加进去
pa2.add(rb1);
pa2.add(rb2);
pa2.add(rb3);
pa2.add(rb4);
pa2.add(rb5);
pa3=new JPanel();
pa3.add(rb6);
pa3.add(rb7);
pa4=new JPanel(); // 创建面板3对象 并把图形按钮加进去
pa4.add(tb1);
pa4.add(tb2);
pa4.add(tb3);
pa4.add(tb4);
pa4.add(tb5);
pa4.add(tb6);
ButtonGroup bg1=new ButtonGroup(); //颜色单选钮放在同一组
bg1.add(rb1);
bg1.add(rb2);
bg1.add(rb3);
bg1.add(rb4);
bg1.add(rb5);
ButtonGroup bg2=new ButtonGroup(); //填充单选钮放在同一组
bg2.add(rb6);
bg2.add(rb7);
ButtonGroup bg3=new ButtonGroup(); //图形按钮放在同一组
bg3.add(tb1);
bg3.add(tb2);
bg3.add(tb3);
bg3.add(tb4);
bg3.add(tb5);
bg3.add(tb6);
pp.add(pa1) ;
pp.add(pa2) ;
pp.add(pa3) ;
pp.add(pa4) ;
fr.pack();//包装框架
fr.setBounds(0,0,850,700); //设置框架大小
fr.setVisible(true);
rb1.addItemListener(this); //用ItemListener监听按钮事件
rb2.addItemListener(this);
rb3.addItemListener(this);
rb4.addItemListener(this);
rb5.addItemListener(this);
rb6.addItemListener(this);
rb7.addItemListener(this);
tb1.addItemListener(this);
tb2.addItemListener(this);
tb3.addItemListener(this);
tb4.addItemListener(this);
tb5.addItemListener(this);
tb6.addItemListener(this);
}
public void itemStateChanged(ItemEvent e) //处理按钮事件实现ItemListener接口中的itemStateChanged(ItemEvent e)函数
{
if(e.getStateChange()==e.SELECTED) //判断点击
{
if(tb1.isSelected()==true)
mydraw.a=1;
else if(tb2.isSelected()==true)
mydraw.a=2;
else if(tb3.isSelected()==true)
mydraw.a=3;
else if(tb4.isSelected()==true)
mydraw.a=4;
else if(tb5.isSelected()==true)
mydraw.a=5;
else if(tb6.isSelected()==true)
mydraw.a=6;
if(e.getSource()==rb1)
mydraw.b=1;
if(e.getSource()==rb2)
mydraw.b=2;
if(e.getSource()==rb3)
mydraw.b=3;
if(e.getSource()==rb4)
mydraw.b=4;
if(e.getSource()==rb5)
mydraw.b=5;
if(e.getSource()==rb6)
mydraw.c=1;
if(e.getSource()==rb7)
mydraw.c=2;
}
}
class CanvasDraw extends Canvas implements KeyListener //定义CanvasDraw类继承画图板Canvas
{
/*int a[]=new int[100]; //定义3个数组,用于保存所选择的按钮,再在重画时用
int b[]=new int[100];
int c[]=new int[100];*/
boolean mflag;//mflag表示鼠标是否进入画图板,进行绘制操作
int linex[]=new int[1000];//纪录直线起始的X坐标
int liney[]=new int[1000];//纪录直线起始的y坐标
int linendx[]=new int[1000];//纪录直线结束的X坐标
int linendy[]=new int[1000];//纪录直线结束的y坐标
int indexL=0;//直线条数
int lineC[]=new int[1000]; //直线的颜色
int lineclass[]=new int[1000]; //图形类型
int linefill[]=new int[1000]; //是否填充
StringBuffer sb=new StringBuffer(); //定义字符串
int currentX=0,currentY=0,startX=0,startY=0;//currentX,currentY表示当前鼠标坐标,startX,startY表示起始坐标
CanvasDraw() //CanvasDraw的构造函数
{
setSize(600,300); //设置大小
setBackground(Color.pink); //设置背景色
addMouseListener(new MouseAdpt(this));//添加鼠标事件
addKeyListener(this); //添加键盘事件
addMouseMotionListener(new MouseMotionAdpt(this));//添加鼠标移动事件
}
void setStart(int x,int y) //鼠标开始绘制
{
startX=x; //纪录起始X坐标位置
startY=y; //纪录起始Y坐标位置
linex[indexL]=x; //存入数组
liney[indexL]=y;
}
void setCurrent(int x,int y) //鼠标当前移动的位置
{
currentX=x; //纪录当前X坐标位置
currentY=y; //纪录当前Y坐标位置
}
void setEnd(int x,int y) //鼠标结束绘制时的位置
{
linendx[indexL]=x;
linendy[indexL]=y;
lineC[indexL]=mydraw.b; //定义3个数组,用于保存所选择的按钮,再在重画时用
lineclass[indexL]=mydraw.a;
linefill[indexL]=mydraw.c;
indexL++;
}
void setMouseDragged(boolean k) //判断鼠标是否处于拖动状态
{
mflag=k;
}
void showMeg(String s) //显示用户消息
{
//mp.showStatus(s);
}
public void keyTyped(KeyEvent e) //键盘打字事件
{
char ch=e.getKeyChar(); //获得键盘的字符
sb.append(ch); //添加入sb
showMeg(""+sb.toString());
repaint();
}
public void keyPressed(KeyEvent e){} //键盘按下事件
public void keyReleased(KeyEvent e){} //键盘释放事件
public void paint(Graphics g)//绘图操作
{
g.drawString("("+currentX+","+currentY+")"+sb,10,20); //在坐标(10,20)处显示当前鼠标的坐标
for(int i=0; i<indexL;i++) //重绘
{
switch(lineC[i])
{
case 1:
g.setColor(Color.black);
break;
case 2:
g.setColor(Color.red);
break;
case 3:
g.setColor(Color.orange);
break;
case 4:
g.setColor(Color.blue);
break;
case 5:
g.setColor(Color.green);
break;
default:
break;
}
if(linefill[i]==1)
{
switch(lineclass[i])
{
case 1:
g.drawLine(linex[i],liney[i],linendx[i],linendy[i]);
break;
case 2:
g.drawRect(Math.min(linex[i],linendx[i]),Math.min(liney[i],linendy[i]),Math.abs(linex[i]-linendx[i]),Math.abs(liney[i]-linendy[i]));
break;
case 3:
g.drawRoundRect(Math.min(linex[i],linendx[i]),Math.min(liney[i],linendy[i]),Math.abs(linex[i]-linendx[i]),Math.abs(liney[i]-linendy[i]),Math.abs(linex[i]-linendx[i])/5,Math.abs(liney[i]-linendy[i])/5);
break;
case 4:
g.drawOval(Math.min(linex[i],linendx[i]),Math.min(liney[i],linendy[i]),Math.abs(linex[i]-linendx[i]),Math.abs(liney[i]-linendy[i]));
break;
case 5:
g.drawOval(Math.min(linex[i],linendx[i]),Math.min(liney[i],linendy[i]),Math.abs(linex[i]-linendx[i]),Math.abs(linex[i]-linendx[i]));
break;
case 6:
g.drawArc(Math.min(linex[i],linendx[i]),Math.min(liney[i],linendy[i]),Math.abs(linex[i]-linendx[i]),Math.abs(liney[i]-linendy[i]),20,160);
break;
default:
break;
}
}
else if(linefill[i]==2)
{
switch(lineclass[i])
{
case 1:
g.drawLine(linex[i],liney[i],linendx[i],linendy[i]);
break;
case 2:
g.fillRect(Math.min(linex[i],linendx[i]),Math.min(liney[i],linendy[i]),Math.abs(linex[i]-linendx[i]),Math.abs(liney[i]-linendy[i]));
break;
case 3:
g.fillRoundRect(Math.min(linex[i],linendx[i]),Math.min(liney[i],linendy[i]),Math.abs(linex[i]-linendx[i]),Math.abs(liney[i]-linendy[i]),Math.abs(linex[i]-linendx[i])/5,Math.abs(liney[i]-linendy[i])/5);
break;
case 4:
g.fillOval(Math.min(linex[i],linendx[i]),Math.min(liney[i],linendy[i]),Math.abs(linex[i]-linendx[i]),Math.abs(liney[i]-linendy[i]));
break;
case 5:
g.fillOval(Math.min(linex[i],linendx[i]),Math.min(liney[i],linendy[i]),Math.abs(linex[i]-linendx[i]),Math.abs(linex[i]-linendx[i]));
break;
case 6:
g.fillArc(Math.min(linex[i],linendx[i]),Math.min(liney[i],linendy[i]),Math.abs(linex[i]-linendx[i]),Math.abs(liney[i]-linendy[i]),20,160);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -