java如何绘画
Java 绘图基础
Java 提供了多种绘图方式,主要通过 java.awt 和 javax.swing 包实现。绘图通常在 JPanel 或 JComponent 的 paintComponent(Graphics g) 方法中进行。
创建自定义绘图组件需继承 JPanel 并重写 paintComponent 方法:
import javax.swing.*;
import java.awt.*;
class MyPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(50, 50, 100, 100);
}
}
基本图形绘制
使用 Graphics 对象可以绘制基本图形:
- 画线:
drawLine(int x1, int y1, int x2, int y2) - 画矩形:
drawRect(int x, int y, int width, int height) - 画圆/椭圆:
drawOval(int x, int y, int width, int height) - 画文本:
drawString(String str, int x, int y)
示例代码:

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(10, 10, 100, 100);
g.drawRect(120, 10, 80, 50);
g.drawOval(220, 10, 80, 50);
g.drawString("Hello", 320, 50);
}
高级绘图(Graphics2D)
Graphics2D 是 Graphics 的子类,提供更强大的功能:
- 设置笔画粗细:
setStroke(Stroke s) - 旋转/缩放:
rotate(double theta),scale(double sx, double sy) - 抗锯齿:
setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)
示例:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(new BasicStroke(5));
g2d.setColor(Color.BLUE);
g2d.drawRect(50, 50, 100, 100);
}
双缓冲技术
避免闪烁可使用双缓冲:

class DoubleBufferedPanel extends JPanel {
private BufferedImage buffer;
public DoubleBufferedPanel() {
buffer = new BufferedImage(400, 400, BufferedImage.TYPE_INT_ARGB);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics bufferGraphics = buffer.getGraphics();
// 在缓冲图像上绘制
bufferGraphics.setColor(Color.WHITE);
bufferGraphics.fillRect(0, 0, 400, 400);
bufferGraphics.setColor(Color.RED);
bufferGraphics.fillOval(100, 100, 200, 200);
// 将缓冲图像绘制到屏幕上
g.drawImage(buffer, 0, 0, this);
}
}
绘制图像文件
加载并绘制图像文件:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
try {
Image image = ImageIO.read(new File("image.png"));
g.drawImage(image, 0, 0, this);
} catch (IOException e) {
e.printStackTrace();
}
}
动画实现
通过定时重绘实现动画效果:
class AnimationPanel extends JPanel {
private int x = 0;
public AnimationPanel() {
Timer timer = new Timer(50, e -> {
x = (x + 5) % getWidth();
repaint();
});
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(x, 50, 50, 50);
}
}
坐标系变换
使用 Graphics2D 进行坐标变换:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.translate(getWidth()/2, getHeight()/2);
g2d.rotate(Math.PI/4);
g2d.drawRect(-50, -50, 100, 100);
}






