JAVA 画图中出现的paint()函数

问题:刚学JAVA,有一个问题。以下是一段JAVA代码,它弹出了一个窗口,并在窗口上使用paint()画出矩形、椭圆、扇面等图形。现在我想让画图行为受用户控制,比如说,开始只有一个空白窗口。当用户输入1,画出矩形。用户输入2,擦掉矩形。用户输入3,画出椭圆。等等等等。

所以小弟应该如何做?有什么思路?需要什么东西?

案例代码:

import java.awt.*;
import javax.swing.*;public class Test extends JFrame { public static void main(String[] args){Test sl = new Test();sl.update();}Test(){super("Sample");setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);setSize(600,600);setVisible(true);}public void update(){repaint();}public void paint(Graphics g) { g.setColor(Color.black);     //有角矩形,起始点(10,30),宽80,高50g.drawRect(10,30,80,50);     //圆角矩形,起始点(110,30),宽80,高50,角(a=20,b=10)g.drawRoundRect(110,30,80,50,20,10);//椭圆,圆心(110,90)、a=80,b=50       g.drawOval(110,90,80,50); //一条弧,圆心(219,30)、a=80,b=50 角度在0-90之间g.drawArc(210,30,80,50,0,90);//扇面,圆心(219,90)、a=80,b=50 角度在0-90之间g.fillArc(210,90,80,50,0,90);}
}

同样的,在俄罗斯方块的代码中,我们也看到了一个public void paint(Graphics g)函数,似乎这个函数没有被任何东西调用,并且还有一个相关联的repeat方法,代码见下面的:

public void paint(Graphics g){g.drawImage(background, 0, 0, null);//使用this 作为观察者g.translate(15, 15);//平移绘图坐标系paintTetromino(g);//绘制正在下落的方块paintWall(g);//画墙paintNextOne(g);paintScore(g);}

一,我们先运行第一个Test程序,得到的图像是:


我们可以看到paint方法是被调用了的。

二,原因分析

首先paint方法,并不仅是JPanel的方法,而是继承自JComponent的方法,该方法说明如下:
/*** Invoked by Swing to draw components* Applications should not invoke <code>paint</code> directly,* but should instead use the <code>repaint</code> method to* schedule the component for redrawing.* <p>* This method actually delegates the work of painting to three* protected methods: <code>paintComponent</code>,* <code>paintBorder</code>,* and <code>paintChildren</code>.  They're called in the order* listed to ensure that children appear on top of component itself.* Generally speaking, the component and its children should not* paint in the insets area allocated to the border. Subclasses can* just override this method, as always.  A subclass that just* wants to specialize the UI (look and feel) delegate's* <code>paint</code> method should just override* <code>paintComponent</code>.** @param g  the <code>Graphics</code> context in which to paint* @see #paintComponent* @see #paintBorder* @see #paintChildren* @see #getComponentGraphics* @see #repaint*/
---------------------
原文:https://blog.csdn.net/tanjun592/article/details/54926041

这个方法是被swing调用来画组件的,应用不应该直接调用paint,而应该调用repaint。paint这个方法实际上代表了三个protected的方法。 *paintComponent,paintBorder,paintChildren. *里面一次调用者三种方法来确保…(略)

重要的是子类通常要重写这个方法,来定制special特殊的图形组件

其次,那么为什么不应该直接调用paint而应该调用repaint呢?查了很多资料,有一个说的很简单,直接。
  • repaint()是重要概念,它是在图形线程后追加一段重绘操作,是安全的!是系统真正调用的重绘!所以如果你需要某个部件刷新一下界面,记得调用repaint(),千万不要直接调用paint()!
  • Graphics是一个抽象类,其实现大都是平台相关的,所以不容易自己创建一个graphics实例。一般graphics的实例会由依照你所在的桌面环境给出。
最后, repaint里面间接调用了paint方法。但是是如何间接调用的呢?repaint方法里面是否new了一个graphics对象呢然后传给paint呢?

repeat方法被调用时,发生什么
Graphics与平台有关的详细介绍

三,程序员使用过程:

所以做一个图形组件的基本思路可以总结为以下过程:
选择适合的基本图形组件 -> 继承它 -> 重写paint等方法->在需要刷新图形的时候调用repaint等方法!
至于Graphics,先假设它存在,因为真正的Graphics实例只有当程序在jvm上跑的时候才会创建。

俄罗斯方块中使用此技术的部分代码:

public class Tetris extends JPanel{public static void main(String[] args) {JFrame frame = new JFrame();Tetris tetris = new Tetris();frame.add(tetris);frame.setSize(525, 590);frame.setUndecorated(false);//true去掉窗口框!frame.setTitle("俄罗斯方块");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//Location 位置 RelativeTo相对于 frame.setLocationRelativeTo(null);//使当前窗口居中frame.setVisible(true);tetris.action();}public void action(){//tetromino = Tetromino.randomTetromino();//nextOne = Tetromino.randomTetromino();//wall[19][2] = new Cell(19,2,Tetris.T);startAction();repaint();KeyAdapter l = new KeyAdapter() {public void keyPressed(KeyEvent e) {int key = e.getKeyCode();if(key == KeyEvent.VK_Q){System.exit(0);//退出当前的Java进程}if(gameOver){if(key==KeyEvent.VK_S){startAction();}return;}//如果暂停并且按键是[C]就继续动作if(pause){//pause = falseif(key==KeyEvent.VK_C){   continueAction();   }return;}//否则处理其它按键switch(key){case KeyEvent.VK_RIGHT: moveRightAction(); break;case KeyEvent.VK_LEFT: moveLeftAction(); break;case KeyEvent.VK_DOWN: softDropAction() ; break;case KeyEvent.VK_UP: rotateRightAction() ; break;case KeyEvent.VK_Z: rotateLeftAction() ; break;case KeyEvent.VK_SPACE: hardDropAction() ; break;case KeyEvent.VK_P: pauseAction() ; break;}repaint();}};this.requestFocus();this.addKeyListener(l);}public void paint(Graphics g){g.drawImage(background, 0, 0, null);//使用this 作为观察者g.translate(15, 15);//平移绘图坐标系paintTetromino(g);//绘制正在下落的方块paintWall(g);//画墙paintNextOne(g);paintScore(g);}

可以看到,main方法中调用了action(),而action()方法中多次使用repaint()方法进行页面刷新。
paint()方法中,实现具体的画图操作,可以看到都是使用Graphics的相关函数,下面列举下其方法

  • g.drawImage(background, 0, 0, null)加载图像,画出图像
  • g.translate(15, 15);//平移绘图坐标系
  • g.setColor(new Color(FONT_COLOR))设置颜色;
  • g.setFont(font);设置字符串的字体
  • g.drawString(str, x, y)画字符串

应该注意的是,这里面没有多少其他组件插入的情况,完全是自己造的,从最基本的开始。

图像化界面paint,repaint方法的总结相关推荐

  1. 图像化界面开发之QT入门

    想要完成一个应用程序的开发,通常还需要一个可视化界面,QT就是可以帮助我们快速开发出可视化界面的一款工具,而利用QT实现页面布局,一般有两种方式,即通过qtdesigner和通过纯代码构建,第一种方式 ...

  2. wsl 1 ubuntu 安装图像化界面

    此 blog 适用于 wsl 1 ubuntu 使用 GUI,wsl 2 请跳过 安装 GUI ubuntu 下可用的 GUI 很多,任意安装一个即可.比较推荐 xfce4,较为简陋,但是启动快,流畅 ...

  3. linux图像化界面读取u盘,Linux上用的4种USB image程序:Etcher,Unetbootin,DD,MultiWriter

    本文介绍Linux上使用的4种最佳USB image应用程序,它们是:Etcher.Unetbootin.DD.GNOME MultiWriter. 1.Etcher Etcher是一款适用于Mac. ...

  4. PyQt5 图形界面 - Qt Designer独立安装包,仅需30M!python图像化界面绘制工具

    工具获取: 小蓝枣的 csdn 资源仓库 如果用来设计 python 图形化界面可以看下面的文档: PyQt5 图形界面-用 Qt Designer 来设计 UI 界面,并转化为 python 代码运 ...

  5. centos 7 网络设置与图像化界面下载

    ①打开虚拟机的设置,找到网络设置.再启用网卡1,选择连接方式为Host-only,界面名称选择VirtualBox Host-Only Ethernet Adapter,设置如下图 提示: 1.对虚拟 ...

  6. win10 WSL2 Ubuntu图像化界面安装和配置

    1.win11 设置 打开虚拟机安装许可 2.开启开发者模式 2.Microsoft Store下载安装ubuntu 我这里使用的是20.04.5LTS版本 3. 打开ubuntu 命令窗口 1.打开 ...

  7. AES算法加解密及简单图像化界面实现

    RIJNDAEL 加密算法 注意:本文实现的AES算法的密钥,明文,密文均为128位,后续可能会添加192位或256位的密钥.函数flag参数默认是1,即加密,在解密调用时改为0即可. 先放个运行效果 ...

  8. 不支持图形化界面的Linux系统如何显示图像化界面?飞腾服务器显示图像化界面方法,DISPLAY environment variable is undefined问题解决方法

    我用的本地 windows 环境访问的飞腾服务器,这个服务器里的系统是不支持图像化界面的,需要通过 display 指定自己的电脑来显示图像化界面. 命令如下,这个 ip 是对应自己电脑的,通过 ip ...

  9. windows linux 化,Xming —— 从 Windows 系统管理图像化的 Linux 应用程序

    1. 关于 Xming Xming 是一个在 Microsoft Windows 计算机上运行的开源 X-Windows 终端機仿真器(X 服务器).Xming 容让 Windows 机器显示在远程 ...

最新文章

  1. webService 远程访问不了的问题
  2. 25个Java机器学习工具库
  3. Jquery的深度拷贝和深度克隆
  4. webService 客户端接口调用【java】
  5. wordpress安装时网页无法打开-调试办法(还没整理完)
  6. php mysql 地理位置_PHP MySql和地理位置
  7. Java基础篇之什么是CharArrayReader
  8. 进度图绘制十大注意事项
  9. 电赛总结(二)——AD芯片总结之AD7705
  10. 最新抖音、快手、西瓜、小红书在线去水印,去水印API接口
  11. Selenium 爬取评论数据,就是这么简单!
  12. 如何抛弃鼠标全键盘操作xcode
  13. STM32 HAL库之USB
  14. ASEMI代理ST/意法STW78N65M5原厂渠道汽车级MOSFET
  15. Unity 程序始终显示在最上层,并且保持交互。
  16. 品味人生(TALK ABOUT LIFE)
  17. 微信小程序开发过程整理
  18. CP-ABE,KP-ABE
  19. php 过滤粘贴_粘贴过滤的数据时出现错误1004
  20. jms规范以及activeMq相关介绍

热门文章

  1. 图片脚本:Python实现图片转pdf、Python生成gif动图
  2. ajax的params,Ajax请求Post Params
  3. Docker部署ELK(ElasticSearch logstash Kibana)
  4. 在浏览器地址栏输入百度网址之后的故事(面试必考)
  5. oracle srvctl命令,ORACLE RAC 数据库服务器上 srvctl 常用的一些操作命令
  6. ZNS SSD是否真的前途一片光明?
  7. 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)
  8. P1506 拯救oibh总部(dfs,洛谷,java)
  9. RTSP中TS流结构分析
  10. 制作ASCII字符动画