鼠标绘图demo

这篇博客介绍了如何使用Java编程语言实现一个简单的鼠标绘图功能,通过监听鼠标事件,实现在画布上绘制线条和其他图形。内容涵盖了Java图形用户界面的基本操作和事件处理机制。
摘要由CSDN通过智能技术生成
package viewImage;

import java.awt.Color;
import java.awt.FileDialog;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JPanel;

public class Main {
	static RGB[][] data = null;
	static int w = 0;
	static int h = 0;
	static ArrayList<ArrayList<Point>> ps = new ArrayList<ArrayList<Point>>();
	static boolean reset = false;
	static JMenuBar menubar = new JMenuBar();
	public static void main(String[] args) {
		MyPanel panel = new MyPanel();
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setTitle("viewIamge");
		frame.setSize(350, 350);
		frame.add(panel);
	
		JButton open = new JButton("open");
		JButton save = new JButton("save");
		JButton clear = new JButton("clear");
		save.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if (data != null) {
					return;
				}
				int maxWidth = -1;
				int maxHeight = -1;
				for (ArrayList<Point> l : ps) {
					for (Point p : l) {
						maxWidth = Math.max(p.x, maxWidth);
						maxHeight = Math.max(maxHeight, p.y);
					}
				}
				int max = Math.max(maxHeight, maxWidth);

				if (max > 0) {
					BufferedImage image = new BufferedImage(max, max, BufferedImage.TYPE_INT_RGB);
					Graphics g = image.getGraphics();
					g.setColor(Color.WHITE);
					g.fillRect(0, 0, max, max);
					byte[] raw = new byte[max * max * 3];
					for (ArrayList<Point> l : ps) {
						for (int i = 0; i < l.size() - 1; i++) {
							Point p1 = l.get(i);
							Point p2 = l.get(i + 1);
							g.setColor(Color.RED);
							g.drawLine(p1.x, p1.y, p2.x, p2.y);
						}
					}
					FileDialog dialog = new FileDialog(frame, "save", FileDialog.SAVE);
					dialog.setVisible(true);
					File img = dialog.getFiles()[0];
					FileOutputStream out;
					try {
						int index = 0;
						for (int x = 0; x < max; x++) {
							for (int y = 0; y < max; y++) {
								int v = image.getRGB(x, y);
								raw[index + 0] = (byte) ((v >> 16) & 0xff);
								raw[index + 1] = (byte) ((v >> 8) & 0xff);
								raw[index + 2] = (byte) ((v >> 0) & 0xff);
								index += 3;
							}
						}
						out = new FileOutputStream(img);
						out.write(raw);
						out.close();
					} catch (Exception e1) {
						e1.printStackTrace();
					}
				}

			}
		});
		open.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				FileDialog dialog = new FileDialog(frame);
				dialog.setVisible(true);
				synchronized (Main.class) {
					File file = dialog.getFiles()[0];
					w = (int) Math.sqrt(file.length() / 3);
					data = new RGB[w][w];
					try {
						FileInputStream in = new FileInputStream(file);
						byte[] raw = new byte[w * w * 3];
						byte[] buf = new byte[1024];
						int len = 0;
						int destPos = 0;
						while ((len = in.read(buf)) > 0) {
							if (destPos + len > raw.length) {
								len = raw.length - destPos;
								System.arraycopy(buf, 0, raw, destPos, len);
								break;
							}
							System.arraycopy(buf, 0, raw, destPos, len);
							destPos += len;
						}
						int index = 0;
						for (int i = 0; i <= raw.length - 3; i += 3) {

							RGB rgb = new RGB();
							rgb.r = raw[i] & 0xff;
							rgb.g = raw[i + 1] & 0xff;
							rgb.b = raw[i + 2] & 0xff;
							data[index / w][index % w] = rgb;
							index++;
						}
						in.close();
						panel.repaint();
					} catch (Exception e1) {
						e1.printStackTrace();
					}
				}
			}
		});
		clear.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				data = null;
				w = 0;
				h = 0;
				ps.clear();
				reset = true;
				panel.repaint();
			}
		});
		menubar.add(open);
		menubar.add(save);
		menubar.add(clear);
		frame.setJMenuBar(menubar);
		frame.add(panel);
		frame.addMouseListener(panel);
		frame.addMouseMotionListener(panel);
		frame.setVisible(true);
	}

	static class RGB {
		int r;
		int g;
		int b;
	}

	static class Point {
		int x;
		int y;
	}

	static class MyPanel extends JPanel implements MouseMotionListener, MouseListener {
		ArrayList<Point> line;

		@Override
		public void paint(Graphics g) {
			super.paint(g);
			if(reset) {
				g.setColor(Color.GRAY);
				g.fillRect(0, 0, this.getWidth(), this.getHeight());
				reset = false;
				return;
			}
			if (data != null) {
				for (int i = 0; i < w; i++) {
					for (int j = 0; j < w; j++) {
						RGB rgb = data[i][j];
						g.setColor(new Color(rgb.r, rgb.g, rgb.b));
						g.drawRect(i, j, 1, 1);
					}
				}
			} else {
				for (ArrayList<Point> l : ps) {
					for (int i = 0; i < l.size() - 1; i++) {
						Point p1 = l.get(i);
						Point p2 = l.get(i + 1);
						g.drawLine(p1.x, p1.y, p2.x, p2.y);
					}
				}
			}
		}

		@Override
		public void mouseClicked(MouseEvent e) {

		}

		@Override
		public void mousePressed(MouseEvent e) {
			line = new ArrayList<Point>();
			Point p = new Point();
			p.x = e.getXOnScreen();
			p.y = e.getYOnScreen() - menubar.getHeight();
			line.add(p);
			ps.add(line);
		}

		@Override
		public void mouseReleased(MouseEvent e) {

		}

		@Override
		public void mouseDragged(MouseEvent e) {
			Point p = new Point();
			p.x = e.getXOnScreen();
			p.y = e.getYOnScreen() - menubar.getHeight();
			line.add(p);
			repaint();
		}

		@Override
		public void mouseMoved(MouseEvent e) {

		}

		@Override
		public void mouseEntered(MouseEvent e) {

		}

		@Override
		public void mouseExited(MouseEvent e) {

		}

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC绘图控件是Microsoft Foundation Class库中的一个工具,它可以用来进行高速图表绘制。该控件具有快速绘图的能力,可以实时更新,并且支持鼠标响应。 MFC绘图控件可以通过MFC绘图示例(MFC Drawing Demo)来演示。该示例程序提供了一个基础的绘图框架,通过这个框架可以创建和绘制各种图形,如直线、矩形、圆等。使用示例程序可以学习和了解MFC绘图控件的基本用法和功能。 在示例程序中,鼠标响应是一个重要的功能。通过对鼠标事件的处理,可以实现一些交互式的操作,比如绘制自由曲线、移动和编辑已有图形等。例如,可以通过鼠标左键点击来创建一个点,通过拖动鼠标可以绘制直线或矩形等。 MFC绘图控件的高速性是其突出的特点之一。在图表绘制中,通常需要频繁地进行绘制操作,如果绘制速度太慢,会导致界面卡顿,影响用户体验。而MFC绘图控件通过利用底层硬件加速和绘图缓冲等技术,可以快速地进行图表绘制,保证了绘制效率和流畅度。 总而言之,MFC绘图控件是一个功能强大的工具,可以用于高速图表绘制。通过鼠标响应,可以实现更多的交互式操作。示例程序提供了一个演示和学习的平台,用户可以深入了解和使用MFC绘图控件的各种功能。 ### 回答2: high-speed charting control(MFC绘图控件)是一种用于在MFC应用程序中绘制快速和高效图表的控件。该控件的作用是帮助开发者在应用程序中实现各种类型的图表,如折线图、柱状图、饼图等。通过使用这个控件,开发者可以轻松地创建具有交互性和响应式的图表。 MFC绘图demo是一个包含了鼠标响应功能的示例程序。该示例程序展示了如何使用high-speed charting control控件来创建图表,并在用户与图表交互时响应鼠标的操作。 在这个demo中,开发者可以看到如何通过添加数据点来绘制折线图。通过鼠标的点击和拖动,用户可以添加、删除和移动数据点,实时更新图表的显示。该demo还演示了如何通过鼠标的滚动来放大和缩小图表的显示范围。 除了基本的绘制功能,MFC绘图demo还提供了一些其他功能,如图表的标注、背景设置和图表的保存与导入等。这些功能使得开发者可以根据实际需要进行图表的定制和扩展。 总结起来,high-speed charting control(MFC绘图控件)以及包含鼠标响应的MFC绘图demo是一种帮助开发者快速绘制高效图表的控件和示例程序。开发者可以根据自己的需求,使用这个控件和示例程序来实现各种类型的交互式图表功能。 ### 回答3: 高速绘图控件是MFC(Microsoft Foundation Classes)框架中的一个重要的组件之一,它可以用于在应用程序中实现图表的绘制和展示。MFC绘图Demo是一个示例程序,展示了如何使用MFC绘图控件来实现图表绘制,并通过鼠标响应来交互操作。 MFC绘图控件使用了高效的绘图算法,能够快速地绘制图表数据,并具有良好的性能。它支持多种类型的图表,如曲线图、柱状图、饼状图等,并提供了丰富的参数和选项,可以用于定制图表的外观和行为。 MFC绘图Demo通过鼠标响应实现了图表的交互操作。用户可以使用鼠标来选择图表中的数据点、拖动图表的视图、放大缩小图表等。通过鼠标操作,用户可以方便地查看和分析图表数据,实现更直观的数据展示和操作。 在MFC绘图Demo中,通过监听鼠标事件,获取鼠标的坐标信息,并根据鼠标的操作来改变图表的显示和行为。例如,当用户点击某个数据点时,可以在图表上显示该数据点的数值或详细信息;当用户拖动图表视图时,可以实现平移图表的功能;当用户使用滚轮滚动鼠标时,可以实现图表的放大缩小。 总之,MFC高速绘图控件和MFC绘图Demo是用于实现图表绘制和交互操作的工具和示例程序,它们可以帮助开发人员快速构建和定制图表功能,并提供高效的数据展示和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值