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);
}
}