1.java绘图技术(Panel面板,画板,paint油漆,Graphics绘图,Frame框架),绘图原理 Component类提供 了两个和绘图相关最重要的方法:
1.paint(Graphics g)绘制组件的外观
2.repaint()刷新组件的外观。
当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件。在以下情况paint()将会被调用:
1.窗口最小化,再最大化
2.窗口的大小发生变化
3.repaint函数被调用
import javax.swing.*;
import java.awt.*;
@SuppressWarnings({"all"})
//@author 靳嘉豪
//creates 2023-04-12-14:34
//演示如何在面板上画出图形
public class DrawCircle extends JFrame {//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);//可以显示
}
}
//1.先定义一个MyPanel,继承JPanel类,画图形,就在面板上画
class MyPanel extends JPanel {
/*说明:
1.MyPanel对象就是一个面板
2,Graphics g吧g理解成一支画笔
3,Graphics 提供了很多绘图方法
Graphics g
*/
@Override
public void paint(Graphics g) {//绘图方法
super.paint(g);//调用父类的方法完成初始化
// 画一个圆形
g.drawOval(10, 10, 300, 200);
}
}
2.Graphics类,Graphics类你可以理解就是画笔,为我们提供了各种绘制图形的方法:[参考jdk帮助文档]
-
- 1.画直线drawLine(int x1,int y1,int x2,int y2)
- 2.画矩形边框drawRect(int X, int y, int width, int height)
- 3.画椭圆边框drawOval(int x, int y, int width, int height)
- 4.填充矩形fillRect(int x, int y, int width, int height)//设置画笔颜色比如g.setColor(Color.blue);然后再fillRect(10,10,200,200);
- 5.填充椭圆fillOval(int x, int y, int width, int height)
- 6.画图片drawlmage(lmage img, int x, int y, ..)//看p527的第八分钟
public void paint(Graphics g) {//绘图方法
super.paint(g);//调用父类的方法完成初始化
Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/"));
//这就是一个模板,/后面加上图片的地址,这个图片先保存到out里面这个文件里面(右键粘贴那个)
g.drawImage(image,,,,,this);//写上x,y,宽高,this则表示是这个图片的
}
-
- 7.画字符串drawString(String str, int x, int y)
- 8.设置画笔的字体setFont(Font font),设置画笔的颜色setColor(Color c)
g.setColor(Color.magenta);
g.setFont(new Font("",Font.BOLD,50));
g.drawString("北京你好",100,100);
3.java监听机制
在我们写完JPanel implements KeyListener,标识到KeyListener上ait+回车进行实现方法
当我们产生一个键盘事件被KeyListener监听到,被监听到会产生一个KeyEvent的对象,这个就是事件对象
package com.hspedu.event;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
//@author 靳嘉豪
//creates 2023-04-13-17:05
//演示小球通过键盘控制上下左右移动来讲解java的事件控制
public class BallMove extends JFrame {//继承JFame窗口
MyPanel mp = null;
public static void main(String[] args) {
BallMove ballMove = new BallMove();
}
public BallMove() {
mp = new MyPanel();
this.add(mp);
this.setSize(400, 300);
this.addKeyListener(mp);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
//面板可以画小球(正因为BallMove extends JFrame,这样画板才能放在JFRAMEDE 的窗口中)
//KeyListener是监听器,来进行监听键盘事件
class MyPanel extends JPanel implements KeyListener {
// 为了小球可以移动,把他左上角的坐标(x,y)设置为变量
int x = 10;
int y = 10;
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillOval(x, y, 20, 20);
}
//有字符输出时,该方法会触发
@Override
public void keyTyped(KeyEvent e) {
}
//当某个键按下,该方法会触发
@Override
public void keyPressed(KeyEvent e) {
// System.out.println((char)e.getKeyCode()+"备按下")
// 根据用户按下的不同键,来处理小球的移动(上下左右的键)
//在java中,会给每一个键,分配-个 值(int)
if (e.getKeyCode() == KeyEvent.VK_DOWN) {//KeyEvent.VK_ DOWN就是向下的箭头对应的code
y+=2;
}else if(e.getKeyCode() == KeyEvent.VK_UP){
y-=2;
}else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
x+=2;
}else if(e.getKeyCode() == KeyEvent.VK_LEFT){
x-=2;
}
this.repaint();
}
//当某个键释放(松开),该方法会触发
@Override
public void keyReleased(KeyEvent e) {
}
}