当前位置: 首页 > news >正文

【老白学 Java】第一次绘制

第一次绘制

码老白
文章来源:《Head First Java》修炼感悟。

在上文中,老白惊叹于事件的神奇魔力,跃跃欲试准备做些图形界面的应用程序。 不过在此之前,老白有必要研究一下 Java 的绘图机制,毕竟一个漂亮的界面才是良好的开端。

一起来涂鸦

你是否相信,Swing 中的所有组件都是「绘制」出来的,每个组件在必要时可以绘制自己。 比如一个 Frame 组件被移动、改变大小、互相遮挡等情况下,会重新绘制自己,而这些绘图时机都是由系统掌控的,完全不需要你参与。

向 GUI 中添加各种组件,视觉上就是一个绘制过程。 其中要用到一个很重要的对象 Graphics,你可以把它理解为一个精密的数字画笔,可以使用各种颜色绘制线条、填充几何图形以及绘制图像等等。

既然窗口中看到的东西都是绘制出来的,那么是不是就是说我们也有机会绘制出自己的内容? 想法一点都没错,实际上很多动画、游戏都是在 GUI 中绘制出来的,而且也没有想象中的困难,接下来让我们来看看具体需要什么操作。

创建专属的绘图板

要想绘制自己的图形,首先要有自己的绘图板。 前面说过,Swing 组件都能绘制自己,那我们就继承一个适合绘制的组件,比如 JPanel,接管(覆盖)它的绘制方法 paintComponent(),写上我们自己的绘制代码。

记住,当组件移动、改变大小、遮挡等有可能破坏组件内容时,系统会自动调用 paintComponent() 方法,千万不要擅自调用! 正确做法是调用 repaint(),然后系统会去调用 paintComponent()

你也不要尝试去创建 Graphics 对象,因为 Graphics 是由系统负责管理的非常重要的设备,Windows 的所有视觉效果都与它有关。 当你需要绘制时,应该由系统交给你使用。

下面开始体验,首先自定义一个画板,然后把它添加到窗口中:

import java.awt.*;
import javax.swing.*;
public class SimpleFrame {// 初始化窗口,进行一些必要的设置private void init() {MyDrawPanel mdp = new MyDrawPanel(); // 创建画板JFrame frame = new JFrame();// 必要设置frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(mdp);frame.setSize(300, 300);frame.setVisible(true);}public static void main(String[] args) {new SimpleFrame().init();}
}
// 自定义的画板
class MyDrawPanel extends JPanel {// 覆盖 JPanel 的绘制方法,填充一个矩形public void paintComponent(Graphics g) {g.setColor(Color.ORANGE);		// 设置填充颜色g.fillRect(20, 50, 100, 100);	// 填充一个矩形,坐标 20,50,大小 100x100}
}

编译执行:
填充矩形
哈哈~~~ 看起来还不错。
继续,使用随机颜色填充一个椭圆形:

// 自定义的画板
class MyDrawPanel extends JPanel {// 覆盖 JPanel 的绘制方法,随机颜色填充一个椭圆形public void paintComponent(Graphics g) {int red = (int) (Math.random() * 255);int green = (int) (Math.random() * 255);int blue = (int) (Math.random() * 255);Color randomColor = new Color(red, green, blue);g.fillRect(0, 0, this.getWidth(), this.getHeight());g.setColor(randomColor);		// 设置填充颜色g.fillOval(70, 70, 100, 100);	// 填充一个椭圆形}
}

这次使用了随机颜色,每次运行都会由不同颜色填充。
填充圆形
再来,试一试绘制图像:

// 自定义的画板
class MyDrawPanel extends JPanel {// 覆盖 JPanel 的绘制方法,绘制一幅图像public void paintComponent(Graphics g) {Image img = new ImageIcon("jianqingyan.png").getImage();g.drawImage(img, 0, 0, this);}
}

编译执行:
绘制图片

赏心悦目,简直太漂亮了!

内容预告

下一篇文章,老白将继续介绍一个更好用的 Graphics2D 画笔,利用它你可以轻松地绘制出更加复杂的图形。


《 上一篇 第一个事件下一篇 神来之笔 Graphics2D 》

http://www.mrgr.cn/news/81819.html

相关文章:

  • ModiLeo交易平台:引领数字货币交易新未来
  • 计算机网络 (10)网络层
  • csrf跨站请求伪造(portswigger)无防御措施
  • SpringBoot(Ⅱ-2)——,SpringBoot版本控制,自动装配原理补充(源码),自动导包原理补充(源码),run方法
  • note 41:账务系统开发规范
  • Git如何设置和修改当前分支跟踪的上游分支
  • 阿里云人工智能工程师ACA认证免费课程学习笔记
  • Maven + MyBatis
  • MoH:将多头注意力(Multi-Head Attention)作为头注意力混合(Mixture-of-Head Attention)
  • Vuex用法
  • C++进阶重点知识(一)|智能指针|右值|lambda|STL|正则表达式
  • springboot整合log4j2案例以及异常输出格式案例2
  • 【SpringMVC】REST 风格
  • Pytorch | 利用DTA针对CIFAR10上的ResNet分类器进行对抗攻击
  • ipad如何直连主机(Moonlight Sunshine)
  • 【Linux学习五】时间日期指令与查找指令
  • 将现有Web 网页封装为macOS应用
  • Shell的变量功能
  • 学习记录—正则表达式-基本语法
  • 总结TCP/IP四层模型
  • jdk动态代理和cglib动态代理对比
  • Linux Debian安装ClamAV和命令行扫描病毒方法,以及用Linux Shell编写了一个批量扫描病毒的脚本
  • QTday3
  • 2024第一届Solar杯应急响应挑战赛
  • iDP3复现代码数据预处理全流程(二)——vis_dataset.py
  • 使用Xilinx PCIE XDMA框架读写访问DDR3内容