安徽省校园网站建设,wordpress内网oss,免费查企业哪个软件最好,微信公众号制作模板免费AWT编程 语雀
仓库#xff1a;Java图形化界面: Java图形化界面学习demo与资料 (gitee.com)
很多程序如各种小游戏都需要在窗口中绘制各种图形#xff0c;除此之外#xff0c;即使在开发JavaEE项目时#xff0c; 有 时候也必须动态地向客户 端生成各种图形、…
AWT编程 · 语雀
仓库Java图形化界面: Java图形化界面学习demo与资料 (gitee.com)
很多程序如各种小游戏都需要在窗口中绘制各种图形除此之外即使在开发JavaEE项目时 有 时候也必须动态地向客户 端生成各种图形、图表比如 图形验证码、统计图等这都需要利用AWT的绘图功能。
组件绘图原理
之前我们已经学习过很多组件例如Button、Frame、Checkbox等等不同的组件展示出来的图形都不一样其实这些组件展示出来的图形其本质就是用AWT的绘图来完成的。
在AWT中真正提供绘图功能的是Graphics对象那么Component组件和Graphics对象存在什么关系才能让Component绘制自身图形呢在Component类中提供了下列三个方法来完成组件图形的绘制与刷新
paint(Graphics g):绘制组件的外观
update(Graphics g):内部调用paint方法刷新组件外观
repaint():调用update方法刷新组件外观 一般情况下update和paint方法是由AWT系统负责调用如果程序要希望系统重新绘制组件可以调用repaint方法完成。
Graphics类的使用
实际生活中如果需要画图首先我们得准备一张纸然后在拿一支画笔配和一些颜色就可以在纸上画出来各种各样的图形例如圆圈、矩形等等。 程序中绘图也一样也需要画布画笔颜料等等。AWT中提供了Canvas类充当画布提供了Graphics类来充当画笔通过调用Graphics对象的setColor()方法可以给画笔设置颜色。
画图的步骤
1.自定义类继承Canvas类重写paint(Graphics g)方法完成画图
2.在paint方法内部真正开始画图之前调用Graphics对象的setColor()、setFont()等方法设置画笔的颜色、字体等属性
3.调用Graphics画笔的drawXxx()方法开始画图。
其实画图的核心就在于使用Graphics画笔在Canvas画布上画出什么颜色、什么样式的图形所以核心在画笔上下表中列出了Graphics类中常用的一些方法
案例
使用AWT绘图API完成下图效果 演示代码
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;public class SimpleDraw {private final String RECT_SHAPErect;private final String OVAL_SHAPEoval;private Frame frame new Frame(这里测试绘图);private Button drawRectBtn new Button(绘制矩形);private Button drawOvalBtn new Button(绘制椭圆);//用来保存当前用户需要绘制什么样的图形private String shape;private MyCanvas drawArea new MyCanvas();public void init(){//为按钮添加点击事件drawRectBtn.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {shape RECT_SHAPE;drawArea.repaint();}});drawOvalBtn.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {shape OVAL_SHAPE;drawArea.repaint();}});//定义一个Panel装载两个按钮Panel p new Panel();p.add(drawRectBtn);p.add(drawOvalBtn);//把panel添加到frame底部frame.add(p,BorderLayout.SOUTH);//设置画布的大小drawArea.setPreferredSize(new Dimension(300,200));//把画布添加到frame中frame.add(drawArea);frame.pack();frame.setVisible(true);}public static void main(String[] args) {new SimpleDraw().init();}//1.自定义类继承Canvas类重写paint方法private class MyCanvas extends Canvas{Overridepublic void paint(Graphics g) {Random r new Random();if (shape.equals(RECT_SHAPE)){//绘制矩形g.setColor(Color.BLACK);g.drawRect(r.nextInt(200),r.nextInt(100),40,60);}if(shape.equals(OVAL_SHAPE)){//绘制椭圆g.setColor(Color.RED);g.drawOval(r.nextInt(200),r.nextInt(100),60,40);}}}
} Java也可用于开发一些动画。所谓动画就是间隔一定的时间(通常小于0 . 1秒 )重新绘制新的图像两次绘制的图像之间差异较小肉眼看起来就成了所谓的动画 。
为了实现间隔一定的时间就重新调用组件的 repaint()方法可以借助于 Swing 提供的Timer类Timer类是一个定时器 它有如下一个构造器 Timer(int delay, ActionListener listener): 每间隔 delay 毫秒系统自动触发 ActionListener 监听器里的事件处理器方法在方法内部我们就可以调用组件的repaint方法完成组件重绘。
案例2
使用AWT画图技术及Timer定时器完成下图中弹球小游戏。 演示代码2
package awt_swimg.day03;import awt_swimg.day01.Utils;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;public class PinBall {//桌面宽度private final int TABLE_WIDTH 300;//桌面高度private final int TABLE_HEIGHT 400;//球拍的高度和宽度private final int RACKET_WIDTH 60;private final int RACKET_HEIGHT 20;//小球的大小private final int BALL_SIZE 16;//定义小球纵向运行速度private int ySpeed 10;//小球横向运行速度private int xSpeed 5;//定义小球的初始坐标private int ballX 120;private int ballY 20;//定义球拍的初始坐标x坐标会发生变化y坐标不会发生变化private int RACKET_X 120;private final int RACKET_Y 340;//声明定时器private Timer timer;private JFrame framenew JFrame(弹球游戏);private MyCanvas canvasnew MyCanvas();//定义游戏结束的标记private boolean isLose false;private KeyListener event new KeyAdapter() {Overridepublic void keyPressed(KeyEvent e) {int keyCode e.getKeyCode();if (keyCode KeyEvent.VK_LEFT) {if (RACKET_X 0) {RACKET_X - 10;}}if (keyCode KeyEvent.VK_RIGHT) {if (RACKET_X TABLE_WIDTH - RACKET_WIDTH) {RACKET_X 10;}}}};private ActionListener timerTasknew ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {if (ballX0||ballXTABLE_WIDTH-BALL_SIZE) {xSpeed-xSpeed;}if (ballY0||ballYRACKET_Y-BALL_SIZEballX RACKET_X ballX RACKET_X RACKET_WIDTH) {ySpeed -ySpeed;}if (ballYRACKET_Y(ballXRACKET_X||ballXRACKET_XRACKET_WIDTH)) {timer.stop();isLosetrue;canvas.repaint();}ballX xSpeed;ballY ySpeed;canvas.repaint();}};private MenuBar menuBarnew MenuBar();private Menu optionnew Menu(选项);private MenuItem reStartnew MenuItem(重新开始);private MenuItem exitnew MenuItem(退出);public void init(){frame.add(canvas);frame.setMenuBar(menuBar);menuBar.add(option);option.add(reStart);option.add(exit);exit.addActionListener(e - System.exit(0));reStart.addActionListener(e - {isLosefalse;ballX 120;ballY 20;RACKET_X 120;canvas.repaint();timer.start();});canvas.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));canvas.addKeyListener(event);frame.addKeyListener(event);timernew Timer(50,timerTask);timer.start();Utils.setJFrame(frame);}public static void main(String[] args) {new PinBall().init();}public class MyCanvas extends Canvas{Overridepublic void paint(Graphics g) {if (isLose) {g.setColor(Color.BLUE);g.setFont(new Font(Times,Font.BOLD,30));g.drawString(游戏结束,80,200);}else{g.setColor(Color.red);g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);g.setColor(Color.green);g.fillRect(RACKET_X, RACKET_Y, RACKET_WIDTH, RACKET_HEIGHT);}}}
}