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方法被调用上代码:
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);
}
}
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) {
}
}

