1.在画板上绘制一个圆形
JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,是一种轻量级容器,可以加入到JFrame窗体中。
画圆源码:
import javax.swing.*; import java.awt.*; /** * java绘制简单圆形 * 继承JFrame框架 */ public class DrawCircle extends JFrame{ // 定义一个面板 private MyPanel mp = null; public static void main(String[] args) { new DrawCircle(); } public DrawCircle() { // 初始化面板 mp = new MyPanel(); // 把面板放入窗口 this.add(mp); // 设置窗口大小 this.setSize(400,300); // 当点击窗口退出时,程序释放 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 可视化 this.setVisible(true); } } /** * 定义一个画板 * JPanel是java提供的一个绘图类 */ class MyPanel extends JPanel { // 定制画板初始化 @Override public void paint(Graphics g) { super.paint(g); // 画圆 // 参数一:圆或椭圆四周包围的矩阵的左上角x坐标 // 参数二:圆或椭圆四周包围的矩阵的左上角y坐标 // 参数三:圆或椭圆的宽度 // 参数四:圆或椭圆的高度 g.drawOval(10,10,100,100); } }
绘图原理:
Component类提供了两个和绘图相关最重要的方法:
paint(Graphics g)控制组件的外观
repaint()刷新组件的外观
那么通过上面的代码可以发现,我们并没有显示的调用paint方法,然而它似乎自己调用了,这是为什么呢?✨
在以下情况下paint将会被调用:😁
组件第一次在屏幕显示的时候
窗口最大化和最小化
窗口大小发生变化
repaint方法被调用
2.绘图常用方法
上代码:
import javax.swing.*; import java.awt.*; /** * java绘制方法演示 */ public class Draw extends JFrame{ // 定义一个面板 private MyPanel2 mp = null; public static void main(String[] args) { new Draw(); } public Draw() { // 初始化面板 mp = new MyPanel2(); // 把面板放入窗口 this.add(mp); // 设置窗口大小 this.setSize(400,300); // 当点击窗口退出时,程序释放 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 可视化 this.setVisible(true); } } /** * 定义一个画板 * JPanel是java提供的一个绘图类 */ class MyPanel2 extends JPanel { // 定制画板初始化 @Override public void paint(Graphics g) { super.paint(g); // 从(10,10)到(100,100)的直线 // g.drawLine(10,10,100,100); // 矩形,左上角(10,10)右上角(100,100) // g.drawRect(10,10,100,100); // 填充矩形,填充蓝色矩形,同样也可以进行填充圆形或椭圆 // g.setColor(Color.BLUE); // g.fillRect(10,10,100,100); // 画字 // 给画笔染色 g.setColor(Color.BLUE); // 设置字体 g.setFont(new Font("隶书",Font.BOLD,50)); g.drawString("IMUSTCTF",70,100); } }
3.java事件处理机制
java事件处理是采取委派事件模型:
JAVA事件处理机制,主要依托于java的键盘监听器实现:
例如,我们想要实现一个最简的键盘监听器,可以测试如下的代码:
import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; /** * java事件处理机制 */ public class Event extends JFrame{ private MyPanel3 mp = null; public static void main(String[] args) { Event event = new Event(); } public Event() { // 初始化面板 mp = new MyPanel3(); // 把面板放入窗口 this.add(mp); // 设置窗口大小 this.setSize(400,300); // 当点击窗口退出时,程序释放 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 可视化 this.setVisible(true); // 设置监听mp键盘事件 this.addKeyListener(mp); } } // KeyListener是一个监听器,可以监听键盘事件 class MyPanel3 extends JPanel implements KeyListener { // 定制画板初始化 @Override public void paint(Graphics g) { super.paint(g); // 画一个填充的小球 g.fillOval(10, 10, 20, 20); } // 有字符输出时,该方法就会被触发 @Override public void keyTyped(KeyEvent keyEvent) { } // 当某个键按下,触发 @Override public void keyPressed(KeyEvent keyEvent) { System.out.println((char)keyEvent.getKeyCode() + "被按下..."); } // 某个键释放,触发 @Override public void keyReleased(KeyEvent keyEvent) { } }
通过按下不同的按键,控制台也会输出不同的结果,例如我们依次按下QWER
:
Q被按下... W被按下... E被按下... R被按下...
现在来上一个成品效果,利用方向键控制小球上下左右移动:
import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; /** * java事件处理机制 */ public class Event extends JFrame { private MyPanel3 mp = null; public static void main(String[] args) { Event event = new Event(); } public Event() { // 初始化面板 mp = new MyPanel3(); // 把面板放入窗口 this.add(mp); // 设置窗口大小 this.setSize(400, 300); // 当点击窗口退出时,程序释放 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 可视化 this.setVisible(true); // 设置监听mp键盘事件 this.addKeyListener(mp); } } // KeyListener是一个监听器,可以监听键盘事件 class MyPanel3 extends JPanel implements KeyListener { int x = 10; // 小球的x坐标 int y = 10; // 小球的y坐标 // 定制画板初始化 @Override public void paint(Graphics g) { super.paint(g); // 画一个填充的小球 g.fillOval(x, y, 20, 20); } // 有字符输出时,该方法就会被触发 @Override public void keyTyped(KeyEvent keyEvent) { } // 当某个键按下,触发 @Override public void keyPressed(KeyEvent keyEvent) { // 用户按下不同的方向键,改变小球的坐标 if (keyEvent.getKeyCode() == KeyEvent.VK_DOWN) { y += 5; } else if (keyEvent.getKeyCode() == KeyEvent.VK_UP) { y -= 5; } else if (keyEvent.getKeyCode() == KeyEvent.VK_LEFT) { x -= 5; } else { x += 5; } // 重绘面板 this.repaint(); } // 某个键释放,触发 @Override public void keyReleased(KeyEvent keyEvent) { } }