当前位置: 首页 > news >正文

Java· swing 小demo

简单的 Java Swing 画图 Demo,包含基本的绘图功能(直线、矩形、椭圆)和颜色选择功能。这个示例代码结构清晰,适合初学者理解 Swing 绘图的基本原理

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;public class SimpleDrawingDemo {public static void main(String[] args) {// 创建并设置GUIJFrame frame = new JFrame("简易绘图工具");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(800, 600);// 创建绘图面板DrawingPanel drawingPanel = new DrawingPanel();// 创建工具栏JPanel toolPanel = new JPanel();JButton lineBtn = new JButton("直线");JButton rectBtn = new JButton("矩形");JButton ovalBtn = new JButton("椭圆");JButton clearBtn = new JButton("清除");// 添加按钮到工具栏toolPanel.add(lineBtn);toolPanel.add(rectBtn);toolPanel.add(ovalBtn);toolPanel.add(clearBtn);// 添加颜色选择器JButton colorBtn = new JButton("颜色");toolPanel.add(colorBtn);// 按钮事件监听lineBtn.addActionListener(e -> drawingPanel.setShapeType(ShapeType.LINE));rectBtn.addActionListener(e -> drawingPanel.setShapeType(ShapeType.RECTANGLE));ovalBtn.addActionListener(e -> drawingPanel.setShapeType(ShapeType.OVAL));clearBtn.addActionListener(e -> drawingPanel.clear());// 颜色选择事件colorBtn.addActionListener(e -> {Color newColor = JColorChooser.showDialog(frame, "选择颜色", drawingPanel.getColor());if (newColor != null) {drawingPanel.setColor(newColor);}});// 添加组件到窗口frame.add(toolPanel, BorderLayout.NORTH);frame.add(drawingPanel, BorderLayout.CENTER);// 显示窗口frame.setVisible(true);}
}// 绘图形状枚举
enum ShapeType {LINE, RECTANGLE, OVAL
}// 绘图形状类
class Shape {private int x1, y1, x2, y2;private Color color;private ShapeType type;public Shape(int x1, int y1, int x2, int y2, Color color, ShapeType type) {this.x1 = x1;this.y1 = y1;this.x2 = x2;this.y2 = y2;this.color = color;this.type = type;}public void draw(Graphics g) {g.setColor(color);switch (type) {case LINE:g.drawLine(x1, y1, x2, y2);break;case RECTANGLE:g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1));break;case OVAL:g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1));break;}}
}// 绘图面板类
class DrawingPanel extends JPanel {private ArrayList<Shape> shapes = new ArrayList<>();private ShapeType currentShapeType = ShapeType.LINE;private Color currentColor = Color.BLACK;private int startX, startY;private Shape currentShape;public DrawingPanel() {setBackground(Color.WHITE);// 添加鼠标监听器addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {startX = e.getX();startY = e.getY();}@Overridepublic void mouseReleased(MouseEvent e) {int endX = e.getX();int endY = e.getY();shapes.add(new Shape(startX, startY, endX, endY, currentColor, currentShapeType));repaint();}});// 添加鼠标移动监听器addMouseMotionListener(new MouseMotionAdapter() {@Overridepublic void mouseDragged(MouseEvent e) {int endX = e.getX();int endY = e.getY();currentShape = new Shape(startX, startY, endX, endY, currentColor, currentShapeType);repaint();}});}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 绘制所有已保存的形状for (Shape shape : shapes) {shape.draw(g);}// 绘制当前正在绘制的形状if (currentShape != null) {currentShape.draw(g);}}public void setShapeType(ShapeType type) {this.currentShapeType = type;}public void setColor(Color color) {this.currentColor = color;}public Color getColor() {return currentColor;}public void clear() {shapes.clear();repaint();}
}

代码功能说明:

  1. 主窗口(SimpleDrawingDemo):创建窗口和工具栏,添加各种绘图工具按钮。
  2. 绘图面板(DrawingPanel):核心绘图区域,处理鼠标事件和图形绘制。
  3. 形状类(Shape):封装绘图形状的属性(位置、颜色、类型)和绘制方法。
  4. 形状类型枚举(ShapeType):定义支持的绘图形状类型(直线、矩形、椭圆)。

使用方法:

  1. 选择绘图工具(直线、矩形、椭圆)。
  2. 点击 "颜色" 按钮选择绘图颜色。
  3. 在白色区域按住鼠标左键并拖动进行绘图。
  4. 点击 "清除" 按钮可以清空画布。

这个 Demo 包含了 Swing 绘图的基本要素:鼠标事件处理、图形绘制、组件布局等。你可以在此基础上添加更多功能,如填充颜色、线条粗细调整、撤销操作等

http://www.xdnf.cn/news/666055.html

相关文章:

  • EasyDarwin的配置与使用
  • MMAction2重要的几个配置参数
  • 《算法笔记》13.2小节——专题扩展->树状数组(BIT) 问题 C: Count Inversions
  • C++面试题:虚函数表(vtable)的底层实现机制与应用解析
  • 守护手部稳定,手抖健康护理全攻略
  • 【关于C++跨平台开发的挑战】
  • 【C++】内存管理,深入解析new、delete
  • 【DAY30】模块和库的导入
  • Docker Volume(存储卷)
  • 动态库版本不配问题排查步骤
  • 牛客round94D
  • java使用https协议访问(自签名证书,运行时指定信任库(不修改系统证书))
  • 城市污水管网流量在线监测方案
  • VPet虚拟桌宠,一款桌宠软件,支持各种互动投喂等. 开源免费并且支持创意工坊
  • 如何搭建perfino监控(分析java服务性能)
  • 从姿势到心态:痉挛性斜颈的多维护理方案
  • old语音识别科大讯飞+deepseek api
  • SOC-ESP32S3部分:13-定时器
  • 删掉省市区的市辖区
  • 推理模型 vs 非推理模型:核心区别及优劣势解析
  • 3.微服务架构编码Base工程模块构建
  • 【stm32开发板】产品设计流程及元件选型
  • 创业团队建设与管理(一)
  • 牛客round94E
  • 「Unity3D」TextMeshPro的TMP_InputField在改变高度时,其中textComponent移动的问题解决
  • VMware Live Recovery 和 VMware Data Recovery区别
  • python 报错记录-Linux 退出python环境
  • Python Day34
  • 聚合CPA/CPS拉新分销平台开发:2025年核心功能与未来趋势解析
  • HarmonyOS运动开发:如何绘制运动速度轨迹