Java Graphics绘制表格和直方图

Java Graphics绘制表格和直方图

最近有一个需求是使用Java的swing中Graphics绘制表格和直方图,感觉还是有点意思记录一下,先上图。
在这里插入图片描述
在这里插入图片描述
​ 开始感觉有点复杂,其实和自己在Windows的画图工具中操作差不多,只不过要使用代码实现。主要用到了Java中的swing库中的JPanel,也就是画板类,根据API文档即可作图。

Jpanel

在这里插入图片描述

需要使用一个类继承Jpanel,然后重载paintComponent方法,使用提供Graphics对象来进行图形的绘制。
在这里插入图片描述

Graphics对象的方法

具体就是对Graphics对象的API的使用,主要使用如下方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JFrame

使用JFrame创建一个窗口,然后将添加JPanel组件,具体API如下在这里插入图片描述

表格实现

import javax.swing.*;
import java.awt.*;

/**
 * 表格的Panel
 */
public class TablePanel extends JPanel {

	@Override
	public void paintComponent(Graphics g) {
		// 窗口高度
		int frameHeight = getHeight();
		// 窗口宽度
		int frameWidth = getWidth();
		// 单元格宽度
		int width = 120;
		// 单元格高度
		int height = 60;
		// 字体大小
		int fontSize = 20;
		// 字体
		String font = "微软雅黑";
		// 显示的字段数
		int fieldSize = 5;
		// 左右偏移量
		int offset = (frameWidth - width * fieldSize) / 2;
		// 行数
		int rows = 6;
		// 设置画笔颜色
		g.setColor(Color.white);
		// 绘制背景色
		g.fillRect(0, 0, frameWidth, frameHeight);
		// 设置画笔颜色
		g.setColor(Color.BLACK);
		// 设置字体
		g.setFont(new Font(font, 1, fontSize));
		// 标题文字x
		g.drawString("表格", frameWidth / 2 - fontSize * 3, height / 2);
		// 设置画笔的颜色为RED 表头背景颜色
		g.setColor(Color.RED);
		// 绘制表头背景
		g.fillRect(offset, height, fieldSize * width, height);
		// 设置画笔颜色为黑色
		g.setColor(Color.BLACK);
		// 表头
		g.drawLine(offset, height, frameWidth - offset, height);
		for (int i = 0; i <= fieldSize; i++) {
			g.drawLine(offset + i * width, height, offset + i * width, height * 2);
			// 表头文字
			g.setFont(new Font(Font.SANS_SERIF, 1, fontSize - 2));
			switch (i) {
			case 0:
				g.drawString("字段一", offset + fontSize, height + height / 2 + fontSize / 2);
				break;
			case 1:
				g.drawString("字段二", offset + i * width + fontSize, height + height / 2 + fontSize / 2);
				break;
			case 2:
				g.drawString("字段三", offset + i * width + fontSize, height + height / 2 + fontSize / 2);
				break;
			case 3:
				g.drawString("字段四", offset + i * width + fontSize, height + height / 2 + fontSize / 2);
				break;
			case 4:
				g.drawString("字段五", offset + i * width + fontSize, height + height / 2 + fontSize / 2);
				break;
			default:
				break;
			}
		}
		g.drawLine(offset, height * 2, frameWidth - offset, height * 2);
		// 内容
		for (int i = 0; i < rows; i++) {
			// 当前行高
			int thisHeight = height * (i + 2);
			// 隔行换色
			if (i % 2 == 0) {
				// 设置画笔的颜色为蓝色
				g.setColor(Color.BLUE);
			} else {
				// 设置画笔的颜色为黄色
				g.setColor(Color.YELLOW);
			}
			// 绘制当前行背景
			g.fillRect(offset, thisHeight, fieldSize * width, height);
			// 设置画笔的颜色为黑色
			g.setColor(Color.BLACK);
			// 当前行的线
			g.drawLine(offset, thisHeight, frameWidth - offset, thisHeight);
			for (int j = 0; j <= fieldSize; j++) {
				// 绘制表格分割线
				g.drawLine(offset + j * width, thisHeight, offset + j * width, thisHeight + height);
			}
			// 当前行的线
			g.drawLine(offset, thisHeight + height, frameWidth - offset, thisHeight + height);
		}
	}
}

直方图实现

import javax.swing.*;
import java.awt.*;
import java.util.*;

public class HistogramPanel extends JPanel {

	@Override
	protected void paintComponent(Graphics g) {
		// 获取当前窗口高度
		int frameHeight = getHeight();
		// 获取当前窗口宽度
		int frameWidth = getWidth();
		// 字体
		String font = "微软雅黑";
		// 字体大小
		int fontSize = 20;
		// 柱状图 宽度
		int width = 40;
		// 柱状图 高度
		int height = 40;
		// 设置画笔颜色
		g.setColor(Color.white);
		// 绘制背景色
		g.fillRect(0, 0, frameWidth, frameHeight);
		// 设置画笔颜色
		g.setColor(Color.BLACK);
		// 设置字体
		g.setFont(new Font(font, 1, 20));
		// 标题文字
		g.drawString("直方图", frameWidth / 2 - fontSize * 3, 30);
		// 绘制底部线条
		g.drawLine(frameWidth / 2 - 200, frameHeight / 2 + 150, frameWidth / 2 + 200, frameHeight / 2 + 150);
		// 绘制左侧线条
		g.drawLine(frameWidth / 2 - 200, frameHeight / 2 + 150, frameWidth / 2 - 200, frameHeight / 2 - 150);
		// 设置字体
		g.setFont(new Font(font, 1, 12));
		// 绘制文字
		g.drawString("y", frameWidth / 2 - 200 - 20, frameHeight / 2 - 150);
		g.drawString("x", frameWidth / 2 + 200, frameHeight / 2 + 150);
		// 起始 宽高坐标
		int initHeight = frameHeight / 2 + 150;
		int initWidth = frameWidth / 2 - 180;
		// 创建随机数
		Random random = new Random();
		// 绘制柱状图
		for (int i = 0; i < 5; i++) {
			// 生成随机数
			int h = random.nextInt(10);
			// 设置画笔颜色
			g.setColor(Color.BLUE);
			// 绘制柱子
			g.fillRect(initWidth + i * (width + 20), initHeight - h * height, width, h * height);
		}
	}
}

主程序

import javax.swing.*;

/**
 * 程序运行类
 */
public class Application {

    public static void main(String[] args) {
        // 创建jframe
        JFrame frame1 = new JFrame();
        // 添加Panel
        frame1.getContentPane().add(new TablePanel());
        // 设置标题
        frame1.setTitle("表格");
        // 设置大小
        frame1.setSize(800, 600);
        // 显示
        frame1.setVisible(true);
        // 居中
        frame1.setLocationRelativeTo(null);
        // 创建jframe
        JFrame frame2 = new JFrame();
        // 添加Panel
        frame2.getContentPane().add(new HistogramPanel());
        // 设置标题
        frame2.setTitle("直方图");
        // 设置大小
        frame2.setSize(800, 600);
        // 显示
        frame2.setVisible(true);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宇0926

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值