利用Java设计绘图版,可以绘画在界面设定位置和大小的直线、空心椭圆或者实心椭圆、空心矩形或者实心矩形和多边形

时间: 2024-03-11 15:44:45 浏览: 15
好的,下面是一个稍微复杂一点的利用Java设计绘图板的示例,可以绘制直线、空心椭圆或者实心椭圆、空心矩形或者实心矩形和多边形。示例代码如下: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class DrawBoard extends JFrame { private DrawPanel drawPanel; private JPanel toolPanel; private JButton lineBtn, ovalBtn, rectBtn, polyBtn; private JComboBox<String> thicknessBox; private JLabel statusLabel; private int startX, startY, endX, endY; private int shapeType = 0; private int thickness = 1; private boolean isFilled = false; private enum ShapeType { LINE, OVAL, RECT, POLY } public DrawBoard() { setTitle("绘图板"); setSize(600, 500); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); // 工具面板 toolPanel = new JPanel(); toolPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); lineBtn = new JButton("直线"); ovalBtn = new JButton("椭圆"); rectBtn = new JButton("矩形"); polyBtn = new JButton("多边形"); thicknessBox = new JComboBox<String>(new String[] {"1", "2", "3", "4", "5"}); statusLabel = new JLabel("就绪"); toolPanel.add(lineBtn); toolPanel.add(ovalBtn); toolPanel.add(rectBtn); toolPanel.add(polyBtn); toolPanel.add(new JLabel("线宽:")); toolPanel.add(thicknessBox); toolPanel.add(statusLabel); add(toolPanel, BorderLayout.NORTH); // 绘图面板 drawPanel = new DrawPanel(); add(drawPanel, BorderLayout.CENTER); // 直线按钮事件 lineBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { shapeType = ShapeType.LINE.ordinal(); statusLabel.setText("绘制直线"); } }); // 椭圆按钮事件 ovalBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { shapeType = ShapeType.OVAL.ordinal(); statusLabel.setText("绘制椭圆"); } }); // 矩形按钮事件 rectBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { shapeType = ShapeType.RECT.ordinal(); statusLabel.setText("绘制矩形"); } }); // 多边形按钮事件 polyBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { shapeType = ShapeType.POLY.ordinal(); statusLabel.setText("绘制多边形"); } }); // 线宽下拉框事件 thicknessBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { thickness = thicknessBox.getSelectedIndex() + 1; } }); // 鼠标事件 drawPanel.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { startX = e.getX(); startY = e.getY(); } public void mouseReleased(MouseEvent e) { endX = e.getX(); endY = e.getY(); drawShape(startX, startY, endX, endY, shapeType, thickness, isFilled); statusLabel.setText("就绪"); } }); // 多边形绘制事件 drawPanel.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { if (shapeType == ShapeType.POLY.ordinal()) { drawPanel.setTempPoint(e.getX(), e.getY()); drawPanel.repaint(); } } }); setVisible(true); } private void drawShape(int x1, int y1, int x2, int y2, int shapeType, int thickness, boolean isFilled) { Graphics2D g2d = (Graphics2D) drawPanel.getGraphics(); g2d.setStroke(new BasicStroke(thickness)); g2d.setColor(Color.BLACK); if (shapeType == ShapeType.LINE.ordinal()) { g2d.drawLine(x1, y1, x2, y2); } else if (shapeType == ShapeType.OVAL.ordinal()) { if (isFilled) { g2d.fillOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1)); } else { g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1)); } } else if (shapeType == ShapeType.RECT.ordinal()) { if (isFilled) { g2d.fillRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1)); } else { g2d.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1)); } } else if (shapeType == ShapeType.POLY.ordinal()) { int[] xPoints = drawPanel.getxPoints(); int[] yPoints = drawPanel.getyPoints(); int nPoints = drawPanel.getNumPoints(); if (isFilled) { g2d.fillPolygon(xPoints, yPoints, nPoints); } else { g2d.drawPolygon(xPoints, yPoints, nPoints); } } g2d.dispose(); } public static void main(String[] args) { new DrawBoard(); } } class DrawPanel extends JPanel { private int[] xPoints; private int[] yPoints; private int numPoints; private int tempX, tempY; public DrawPanel() { setBackground(Color.WHITE); setVisible(true); } public void paintComponent(Graphics g) { super.paintComponent(g); if (numPoints > 0) { g.drawPolyline(xPoints, yPoints, numPoints); } if (tempX != 0 && tempY != 0) { g.drawLine(xPoints[numPoints - 1], yPoints[numPoints - 1], tempX, tempY); } } public void setTempPoint(int x, int y) { tempX = x; tempY = y; repaint(); } public int[] getxPoints() { return xPoints; } public int[] getyPoints() { return yPoints; } public int getNumPoints() { return numPoints; } public void addPoint(int x, int y) { if (numPoints == 0) { xPoints = new int[100]; yPoints = new int[100]; } xPoints[numPoints] = x; yPoints[numPoints] = y; numPoints++; } public void clearPoints() { numPoints = 0; tempX = 0; tempY = 0; repaint(); } } ``` 这个示例中,工具面板包括直线、椭圆、矩形和多边形四个按钮,以及线宽下拉框和状态栏。绘图面板包括一个鼠标事件监听器和一个多边形绘制事件监听器。在鼠标事件监听器中,根据当前选择的形状类型、线宽和是否填充来绘制直线、椭圆或矩形。在多边形绘制事件监听器中,根据鼠标移动的轨迹来绘制多边形。 您可以根据自己的需求和能力进行修改和扩展,例如添加更多的图形类型、颜色选择、撤销操作等等,使得绘图板更加实用和方便。

相关推荐

最新推荐

recommend-type

Java利用for循环输出空心三角形、空心菱形和空心矩形的代码

今天小编就为大家分享一篇关于Java利用for循环输出空心三角形、空心菱形和空心矩形的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
recommend-type

详解CSS3 用border写 空心三角箭头 (两种写法)

本篇文章主要介绍了CSS3 用border写 空心三角箭头 (两种写法),非常具有实用价值,需要的朋友可以参考下
recommend-type

【实用方法】--制作CAD空心字,用于激光线切割.doc

【实用方法】--制作CAD空心字,用于激光线切割【实用方法】--制作CAD空心字,用于激光线切割【实用方法】--制作CAD空心字,用于激光线切割【实用方法】--制作CAD空心字,用于激光线切割【实用方法】--制作CAD空心字...
recommend-type

二维画图板——绘制橡皮筋图形

绘制铅笔画、直线、空心○、实心○、空心椭圆、实心椭圆、空心矩形、实心矩形等,实现区域填充及取消填充;还可以选择画笔颜色、改变画笔大小、橡皮擦、新建、打开、保存、字体选择等功能。
recommend-type

Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失效果实例

主要介绍了Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失效果实例,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。