Java学习 之 画图板 ONE

本文详细介绍如何使用Java Swing创建一个多功能画图板应用,包括直线、矩形、圆形、多边形绘制,橡皮擦功能及颜色选择,同时讲解了在JFrame上添加组件、JPanel使用、菜单栏创建及鼠标监听器实现。

画板

画板为创建的窗体

在窗体JFrame上添加组件

public void initUI(){
   JFrame jf=new JFrame();
   jf.setTitle("画图板");
   jf.setSize(800, 800);
   jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   //jf.setResizable(false);
   jf.setLocationRelativeTo(null);

   //流式布局
   FlowLayout fl=new FlowLayout();
   jf.setLayout(fl);
   
   //按钮
   JButton btnLine=new JButton("直线");
   JButton btnRect=new JButton("矩形");
   JButton btnOval=new JButton("圆");
   JButton btntri=new JButton("三角形");
   JButton btnEraser=new JButton("橡皮擦");
   JButton btnlft=new JButton("立方体");
   jf.add(btnLine);
   jf.add(btnRect);
   jf.add(btnOval);
   jf.add(btntri);
   jf.add(btnEraser);
   jf.add(btnlft);

   JButton btnColor=new JButton("颜色");
   jf.add(btnColor);
    
   jf.setVisible(true);

在面板JPanel上添加组件

面板JPanel需要添加在窗体JFrame上

   //按钮面板
   JPanel jp = new JPanel();
   jp.setBackground(new Color(255,200,250));//设置按钮面板背景色
   jp.setPreferredSize(new Dimension(100,100));//设置大小,如果放在西方向上,高设置了不起作用,会占满
   
   //绘画面板
   MyJPanel jpDraw=new MyJPanel();
   jpDraw.setBackground(new Color(255,230,250));//画板背景色
   //jpDraw.setPreferredSize(new Dimension(100,100));//设置了没用懒得设,反正都占满,呸
   
   //边界布局
   BorderLayout bl = new BorderLayout();
    jf.setLayout(bl);
   
   JButton btnLine=new JButton("直线");
   JButton btnRect=new JButton("矩形");
   JButton btnOval=new JButton("圆");
   JButton btntri=new JButton("三角形");
   JButton btnEraser=new JButton("橡皮擦");
   JButton btnlft=new JButton("立方体");
   jp.add(btnLine);
   jp.add(btnRect);
   jp.add(btnOval);
   jp.add(btntri);
   jp.add(btnEraser);
   jp.add(btnlft);
   
   JButton btnColor=new JButton("颜色");
   jp.add(btnColor);
   
   JSlider sld=new JSlider(0,100);
   jp.add(sld);
   //将按钮面板添加到窗体上的西方向
   jf.add(jp,BorderLayout.WEST);
   //将画图面板添加到窗体上的除东南西北四个方向面板位置的中间
   jf.add(jpDraw);
   
   jf.setVisible(true);

在画板上添加菜单栏

菜单栏:JMenuBar
菜单: JMenu
菜单项: JMenuItem

菜单项添加在菜单上,菜单添加在菜单栏上,菜单栏添加在容器上

   //菜单栏:JMenuBar
   JMenuBar jmb=new JMenuBar();
   //菜单: JMenu
   JMenu jmfile=new JMenu("文件File");
   JMenu jmEdit=new JMenu("编辑Edit");
   JMenu jmDraw=new JMenu("分形");
   //菜单项: JMenuItem
   JMenuItem fileItem=new JMenuItem("新建");
   JMenuItem DrawItem1=new JMenuItem("分形1");
   JMenuItem DrawItem2=new JMenuItem("分形2");
   JMenuItem DrawItem3=new JMenuItem("分形3");
   //菜单项“新建”添加在菜单“文件”中
   jmfile.add(fileItem);
   //三个菜单项“分型123”添加在菜单“分型”中
   jmDraw.add(DrawItem1);
   jmDraw.add(DrawItem2);
   jmDraw.add(DrawItem3);
   //菜单“文件”“编辑”“分型”添加在菜单栏上
   jmb.add(jmfile);
   jmb.add(jmEdit);
   jmb.add(jmDraw);
   //窗体设置菜单栏,不用add用set
   jf.setJMenuBar(jmb);

下面是炒鸡无敌巨好看的少女粉色画板
在这里插入图片描述
真的是和本人一样好看_(:3」∠❀)_

画笔

绘制工具 Graphics
不能直接实例化
需要从绘制的组件或窗体上使用getGraphics()获得

Graphics g=jpDraw.getGraphics();

鼠标监听器

接口MouseListener

public interface MouseListener extends EventListener {
    public void mouseClicked(MouseEvent e);//点击鼠标时调用
    public void mousePressed(MouseEvent e);//按压鼠标时调用
    public void mouseReleased(MouseEvent e);//释放鼠标时调用
    public void mouseEntered(MouseEvent e);//鼠标进入时调用
    public void mouseExited(MouseEvent e);//鼠标离开时调用
}

接口MouseMotionListener

public interface MouseMotionListener extends EventListener {
     public void mouseDragged(MouseEvent e);//鼠标拖动
     public void mouseMoved(MouseEvent e);//鼠标移动
}

创建监听器类

一个类可以实现多个接口,这里用了动作监听器和鼠标监听器

public class DrawListener implements MouseListener,ActionListener,MouseMotionListener{
    int x1,x2,y1,y2;//坐标
    int x3,y3,x4,y4,x5,y5;
    Graphics g;//画笔
    String btnstr;//按钮内容
    int xs,ys;
    int num=0;
    ...
}

绘制一根直线

直线的参数:两个点坐标
事件产生的源:MouseEvent
操作的实现:通过鼠标来绘制
鼠标监听器:MouseListener

按下鼠标时记录一个点的坐标,释放鼠标时记录另一个点的坐标,然后画出直线

public void actionPerformed(ActionEvent e){
  btnstr=e.getActionCommand();//获得按钮内容
}

public void mousePressed(MouseEvent e){
     x1=e.getX();
     y1=e.getY();
     //按下鼠标获得第一个点的坐标
}
public void mouseReleased(MouseEvent e){
     //第二个点坐标
     x2=e.getX();
     y2=e.getY();
     if(btnstr.equals("直线")){
     //绘制直线
      g.drawLine(x1, y1, x2, y2);
     }
}

绘制矩形和圆同理
矩形以左上角的坐标为参数,圆以外接矩形左上角的坐标为参数
左上角的坐标是较小的坐标,所以如果画的时候是反着画的,就要交换坐标,不然矩形边长就是负的了。

if(x1>x2){
 int xt=x1;
 x1=x2;
 x2=xt;
 }
if(y1>y2){
 int yt=y1;
 y1=y2;
 y2=yt;
}

然后再调用方法画图

g.drawRect(x1, y1, x2-x1, y2-y1);//矩形
g.drawOval(x1, y1, x2-x1, y2-y1);//圆

绘制多边形

鼠标点击一下出现一个点与前一个点相连,双击鼠标该点与前一个点和第一个点相连,出现一个多边形
int n=e.getClickCount();可以获得点击鼠标次数

public void mouseClicked(MouseEvent e){
  int rx=e.getX();
  int ry=e.getY();
  int n=e.getClickCount();//获得点击次数
  System.out.println("点了"+n+"下");

  if(btnstr.equals("三角形"))
  {
   if(n==1){//单击鼠标
       if(num==0){//表示当前是第一个点
       xs=e.getX();
       ys=e.getY();
       x3=xs;//记录前一个坐标
       y3=ys;
       }
       else{
       x4=e.getX();
       y4=e.getY();
       g.drawLine(x3, y3, x4, y4);//当前点与前一个点连线
       x3=x4;//更新前一个点坐标
       y3=y4;
       }
   }
   else if(n==2){//双击鼠标
       x5=e.getX();
       y5=e.getY();
       g.drawLine(x3, y3, x5, y5);//与前一个点连线
       g.drawLine(xs, ys, x5, y5);//与第一个点连线
       num=0;
   }
}

橡皮擦

拖动鼠标时,画出一个填充色为背景色的小矩形。

//橡皮擦
 @Override
 public void mouseDragged(MouseEvent e) {
   int xd=e.getX();
   int yd=e.getY();
   
   if(btnstr.equals("橡皮擦")){
     g.setColor(new Color(255,230,250));//颜色为背景色
     g.fillRect(xd, yd, 10, 10);//填充一个小矩形
     System.out.println("橡皮擦");
   }
 }

使用更多颜色画图

点击颜色按钮时弹出颜色选择器

public void actionPerformed(ActionEvent e){
  btnstr=e.getActionCommand();
  if(btnstr.equals("颜色")){
   JColorChooser jc=new JColorChooser();//颜色选择器
   Color cl=jc.showDialog(null, btnstr, Color.black);//弹出框
   JButton btn =(JButton) e.getSource();//取到点击的组件源
   btn.setBackground(cl);//修改“颜色”按钮的颜色为选择到的颜色
   g.setColor(cl);//设置画笔颜色
  }
 }

在这里插入图片描述
没得了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值