DrawingPanel.java
package com.example.renderer.ui;
/**
* DrawingPanel是SwingUI的绘图面板组件,负责显示所有图形。
*
* <p>主要功能:
* <ul>
* <li>维护图形列表和渲染器引用</li>
* <li>重写paintComponent()实现图形绘制</li>
* <li>默认尺寸800x600像素</li>
* </ul>
*
* @see SwingUI
* @see Shape
* @author liying
* @since 2025-06-14
*/
import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.Objects;
import com.example.renderer.bridge.Renderer;
import com.example.renderer.factory.Shape;
import com.example.renderer.bridge.Renderer;
import com.example.renderer.bridge.SwingRenderer;
import com.example.renderer.factory.Shape;
/**
* 绘图面板组件,负责显示所有图形。
*
* <p>主要功能:
* <ul>
* <li>维护图形列表和渲染器引用</li>
* <li>重写paintComponent()实现图形绘制</li>
* <li>默认尺寸800x600像素</li>
* </ul>
*
* @see SwingUI
* @see Shape
* @author liying
* @since 2025-06-14
*/
public class DrawingPanel extends JPanel {
/** 要渲染的图形列表 */
private List<com.example.renderer.factory.Shape> shapes;
/** 使用的渲染器实现 */
private Renderer renderer;
/**
* 创建绘图面板
* @param shapes 要显示的图形列表(非null)
* @param renderer 使用的渲染器实现(非null)
* @throws NullPointerException 如果shapes或renderer为null
*/
public DrawingPanel(List<com.example.renderer.factory.Shape> shapes, Renderer renderer) {
this.shapes = shapes;
this.renderer = renderer;
setPreferredSize(new Dimension(800, 600));
setBackground(Color.WHITE);
setDoubleBuffered(true); // 启用双缓冲
}
/**
* 绘制组件内容
* @param g 绘图上下文对象
* @throws NullPointerException 如果g为null
*/
@Override
protected void paintComponent(Graphics g) {
Objects.requireNonNull(g, "Graphics context cannot be null");
super.paintComponent(g);
System.out.println("绘制图形数量:" + shapes.size());
if (renderer instanceof SwingRenderer swingRenderer) {
swingRenderer.setGraphics((Graphics2D) g);
for (Shape shape : shapes) {
shape.render(renderer);
}
}
}
}