那什么是JPanel?JFrame 又是什么呢?让我们先来了解一下他们的区别吧:
JFrame是最底层,JPanel是置于其面上,同一个界面只有一个JFrame,一个JFrame可以放多个JPanel。如果你直接在JFrame上放也可以,但是首先不规范,然后要是过于复杂的界面你准备如何处理这么多控件呢?
对于java页面的布局,我的理解就是JFrame 就像是一张大的桌子,你可以直接把鱼呀,肉了,直接放在桌面上,没有盘子进行分类管理,这时我们就需要jpanel这样的盘子来放我们需要的一些控件。便于管理。
那接下来让我们首先使用JPanel 和 JFrame画一个圆:
JFrame 就相当于是一个窗口,你也可以把它理解成是一个画框,而此时JPanel 就相当于是一个画板,通常继承 JPanel 类的面板通过重写paint()方法进行绘图
package huitu.com;
import javax.swing.*;
import java.awt.*;
/**
*计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示
* 器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,
* 整个计算机屏幕共有480000个像素。像素是一个密度单位而厘米是长度单位两
* 者无法比较
*/
@SuppressWarnings({"all"})
public class DrawingTest01 extends JFrame{// JFrame(框架)对应窗口,可以理解成是一个画框
// 演示如何在面板上画出圆形
// 定义一个面板
private MyPanel mp=null;
public static void main(String[] args) {
new DrawingTest01();
}
public DrawingTest01() {
// 初始化面板
mp = new MyPanel();
// 把面板放到窗口(画框)
this.add(mp);
//设置窗口大小
this.setSize(400,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 当退出画框就退出程序
this.setVisible(true);// 可以显示
}
}
/**
* 绘图原理
* √ Component类提供了两个和绘圈相关最重要的方法
* 1. paint(Graphics)绘制组件的外观
* 2. repaint刷新组件的外观
* √当组件第一次在屏幕显示的时候程序会自动的用 paint方法来绘制组件
* 在以下情况 paint将会被调用:
* 1.窗口最小化再最大化
* 2.窗口的大小发生变化
* 3. repaint函数被调用
*/
// 1. 先定义一个MyPanel(面板),继承JPanel 类,画图形就在该面板上画
class MyPanel extends JPanel{
/**
*说明:
* 1. MyPanel 对象就是一个画板
* 2. Graphics g 把 g 理解成一支画笔
* 3. Graphics 提供了很多绘图的方法,可以画出各种图形以及填充颜色
*/
@Override
public void paint(Graphics g) {// 绘图方法
super.paint(g);// 调用父类的方法完成初始化
// 画出一个圆形
g.drawOval(100,100,100,100);
}
}
效果演示:
注意: 所画图形的大小是以窗口大小为参考系的,如果设置值大于了窗口大小,那我们是看不到完整的图形的,就好比你把画画得超出了画框,这种结果是非常不理想的
那么通过对JFrame 和JPanel 的初步了解,接下来让我们来看看他的一些主要方法和绘制各种各样的图形吧
package huitu.com;
import javax.swing.*;
import java.awt.*;
/**
* 绘图方法:
* ●Graphics类
* Graphics类你可以理解就是画笔为我们提供了各种绘制图形的方法[参考dk帮助文档]
*/
public class DrawingTest02 extends JFrame{
private MyPanel_ mp = null;
public static void main(String[] args) {
new DrawingTest02();
}
public DrawingTest02() {
// 初始化面板
mp = new MyPanel_();
// 把面板放到窗口(画框)
this.add(mp);
//设置窗口大小
this.setSize(1000, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 当退出画框就退出程序
this.setVisible(true);// 可以显示
}
}
class MyPanel_ extends JPanel{
@Override
public void paint(Graphics g) {// 绘图方法
super.paint(g);// 调用父类的方法完成初始化
// 绘制不同的图形
//1.画直线drawLine(int x1, int y1, int x2, int y2)
g.drawLine(10,10,100,100);// 确定两点坐标
//2.画矩形边框 drawRect(int x, int y, int width, int height)
g.drawRect(10,10,100,100);
// g.draw3DRect(); 3D
// 3.画椭圆边框 drawOval(int x, int y, int width, int height)
g.drawOval(10,10,100,100);
//4.填充矩形 fillRect(int x, int y, int width, int height)
// 设置画笔颜色
g.setColor(Color.red);
g.fillRect(40,50,100,100);
// 5.填充椭圆 fillOval(int int int width, int height)
g.setColor(Color.orange);
g.fillOval(100,100,100,200);
// 6.画图片 drawImage(Image img, int x,int y,..)
// 1. 加载图片资源(获取图片资源)
Image image = Toolkit.getDefaultToolkit().getImage("D:\\风耀.jpg");
g.drawImage(image,270,100,324,462,this);
// 7.画字符串 drawString(String str,int x, int y)
g.setColor(Color.BLUE);
g.setFont(new Font("隶书",Font.BOLD,50));// 隶书 ,粗体,大小
g.drawString("为战而生,至死方休",220,80);
// 8.设置画笔的字体setFont(Font font)
// 9.设置画笔的颜色setColor(Color)
}
}
效果演示:
另外还有一种插入图片的方式:
重写paintComponent()方法其触发调用的机制和paint()方法相同
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 6.画图片 drawImage(Image img, int x,int y,..)
// 1. 加载图片资源(获取图片资源)
Image image = Toolkit.getDefaultToolkit().getImage("D:\\风耀.jpg");
g.drawImage(image,270,100,324,462,this);
}
当然我只是展示了其中一部分方法,其他的方法大家可以通过观看javaAPI查看 ,这也只是java图形界面设计的一点点基础,更多的创作思路还需要大家亲自去体验