jfreechart 对于鼠标事件响应的扩展

    jfreechart是一个优秀的开源chart软件。利用jfreechart可以绘制出各种丰富和优美的图形。但是在jfreechart的图上对于鼠标的支持不很充分,对于鼠标的clicked、moved、pressed、released、entered、exited的事件只支持了两个clicked和moved(不知道为什么?),幸运的是jfreechart是一个开源的软件,可以对于它的实现进行升级,在它传统的功能基础上,实现自己的功能需求。

   jfreechart中的鼠标事件实现机制为:一是扩展java.util.EventListener接口为ChartMouseListener,在其中定义了chartMouseClicked和chartMouseMoved两个事件响应函数;而是继承java.util.EventObject类生成ChartMouseEvent,在ChartMouseEvent中封装了鼠标事件和Jfreechart的对象,供事件处理函数中应用;三是在jfreechart的ChartPanel中定义了事件监听器队列,当外部程序注册了事件监听器后,在chartpanel中发生定义的事件后,监听器响应响应的事件。

   在jfreechart默认的实现中,对于鼠标事件,只有clicked和moved可以供外部监听,其他事件提供了默认的监听实现,这样就阻碍了外部对jfreechart的更深入的鼠标操作。

   为了实现其它事件能够被外部监听器监听,首先需要对ChartPanel中的事件监听机制进行调整,这里我利用MyChartPanel继承ChartPanel,重载其中所需要被外部监听器监听的事件的实现函数,把事件发给外部的监听器,类定义如下所示:

import java.awt.Insets;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;

import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.ChartEntity;
import org.jfree.chart.entity.EntityCollection;

@SuppressWarnings("serial")
public class MyChartPanel extends ChartPanel {


	public MyChartPanel(JFreeChart chart) {
		super(chart);
		// TODO Auto-generated constructor stub
	}

	/* (non-Javadoc)
	 * @see org.jfree.chart.ChartPanel#mousePressed(java.awt.event.MouseEvent)
	 */
	@Override
	public void mousePressed(MouseEvent event) {
		// TODO Auto-generated method stub
	       Insets insets = getInsets();
	        int x = (int) ((event.getX() - insets.left) /this.scaleX);
	        int y = (int) ((event.getY() - insets.top) / this.scaleY);

	        this.anchor = new Point2D.Double(x, y);
	        if (this.chart == null) {
	            return;
	        }
	        this.chart.setNotify(true);  // force a redraw
	        // new entity code...
	        Object[] listeners = this.chartMouseListeners.getListeners(
	                ChartMouseListener.class);
	        if (listeners.length == 0) {
	            return;
	        }

	        ChartEntity entity = null;
	        if (this.info != null) {
	            EntityCollection entities = this.info.getEntityCollection();
	            if (entities != null) {
	                entity = entities.getEntity(x, y);
	            }
	        }
	        ChartMouseEvent chartEvent = new ChartMouseEvent(getChart(), event,
	                entity);
	        for (int i = listeners.length - 1; i >= 0; i -= 1) {
	            ((MyChartMouseListener) listeners[i]).chartMousePressed(chartEvent);
	        }
	}

	/* (non-Javadoc)
	 * @see org.jfree.chart.ChartPanel#mouseReleased(java.awt.event.MouseEvent)
	 */
	@Override
	public void mouseReleased(MouseEvent event) {
		// TODO Auto-generated method stub
	       Insets insets = getInsets();
	        int x = (int) ((event.getX() - insets.left) /this.scaleX);
	        int y = (int) ((event.getY() - insets.top) / this.scaleY);

	        this.anchor = new Point2D.Double(x, y);
	        if (this.chart == null) {
	            return;
	        }
	        this.chart.setNotify(true);  // force a redraw
	        // new entity code...
	        Object[] listeners = this.chartMouseListeners.getListeners(
	                ChartMouseListener.class);
	        if (listeners.length == 0) {
	            return;
	        }

	        ChartEntity entity = null;
	        if (this.info != null) {
	            EntityCollection entities = this.info.getEntityCollection();
	            if (entities != null) {
	                entity = entities.getEntity(x, y);
	            }
	        }
	        ChartMouseEvent chartEvent = new ChartMouseEvent(getChart(), event,
	                entity);
	        for (int i = listeners.length - 1; i >= 0; i -= 1) {
	            ((MyChartMouseListener) listeners[i]).chartMouseReleased(chartEvent);
	        }
	}

}

 

把mousePressed和mouseReleased事件转发出来。

 扩展ChartMouseListener,增加这两个事件的出来接口:

import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;

public interface MyChartMouseListener extends ChartMouseListener {
	
	public void chartMousePressed(ChartMouseEvent event);
	public void chartMouseReleased(ChartMouseEvent event);
	
}

 实现自定义的MouseListener:

import java.awt.Cursor;
import java.awt.Shape;

import javax.swing.JPanel;

import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.XYItemEntity;
import org.jfree.data.xy.XYIntervalDataItem;
import org.jfree.data.xy.XYIntervalSeries;
import org.jfree.data.xy.XYIntervalSeriesCollection;

public class MyBarChartListener implements MyChartMouseListener {

	@Override
	public void chartMouseClicked(ChartMouseEvent event) {
		// TODO Auto-generated method stub
/*
		JFreeChart chart = event.getChart();

		if (chart == null)
			return;
		XYItemEntity ce = (XYItemEntity) event.getEntity();
		if (ce == null)
			return;
		IntervalXYDataset my = (IntervalXYDataset) ce.getDataset();

		int sindex = ce.getSeriesIndex();
		int iindex = ce.getItem();

		System.out.println("x = " + my.getXValue(sindex, iindex));
		System.out.println("y = " + my.getYValue(sindex, iindex));
*/
	}

	@Override
	public void chartMouseMoved(ChartMouseEvent event) {
		// TODO Auto-generated method stub

	}

	XYItemEntity ce;
	XYIntervalSeriesCollection my;

	@Override
	public void chartMousePressed(ChartMouseEvent event) {
		// TODO Auto-generated method stub
		System.out.println("mouse chartMousePressed");
		JPanel src = (JPanel) event.getTrigger().getSource();

		src.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		JFreeChart chart = event.getChart();

		if (chart == null)
			return;
		ce = (XYItemEntity) event.getEntity();
		if (ce == null)
			return;
		 my = (XYIntervalSeriesCollection) ce.getDataset();
		
		int sindex = ce.getSeriesIndex();
		int iindex = ce.getItem();
		
		Shape shape = ce.getArea();
		
	
		
		System.out.println("sindex = " + sindex);
		System.out.println("iindex = " + iindex);
		System.out.println("x = " + my.getXValue(sindex, iindex));
		System.out.println("y = " + my.getYValue(sindex, iindex));

		
		
		
		XYIntervalSeries series = (XYIntervalSeries) my.getSeries(ce.getSeriesIndex());
		
		System.out.println("y1 = " + shape.getBounds2D().getCenterY());
		

		
/*		series.remove(my.getXValue(sindex, iindex));
	
		Day day1 = new Day(13, 6, 2007);
	        Day day2 = new Day(14, 6, 2007);

		XYBarChartDemo7.addItem(series,day1,day2,sindex);
*/
	
	}

	@Override
	public void chartMouseReleased(ChartMouseEvent event) {
		// TODO Auto-generated method stub
		System.out.println("mouse chartMouseReleased");
		MyChartPanel src = (MyChartPanel) event.getTrigger().getSource();
		src.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		
		double cursorY = event.getTrigger().getY();
		
		System.out.println("y = "+ cursorY);
		
		int seriesIndex = my.getSeriesCount();

		
		double maxY = src.getScreenDataArea().getMaxY();
		double minY = src.getScreenDataArea().getMinY();
		
		double heightY = (maxY-minY)/seriesIndex;
		
		for(int i=0;i<seriesIndex;i++)
		{
			if(cursorY >= minY && cursorY<=(i+1)*heightY)
			{
				XYIntervalSeries srcSeries =((XYIntervalSeriesCollection) (this.ce.getDataset())).getSeries(seriesIndex-i-1);
				
				XYIntervalSeriesCollection destSeriesCollection = (XYIntervalSeriesCollection) (this.ce.getDataset());
				XYIntervalSeries destSeries =destSeriesCollection.getSeries(this.ce.getSeriesIndex());
				XYIntervalDataItem item = (XYIntervalDataItem) destSeries.getDataItem(this.ce.getItem());			
				
				srcSeries.add(item.getX(), item.getXLowValue(), item.getXHighValue(), seriesIndex-i-1, seriesIndex-i-1-0.1, seriesIndex-i-1+0.3);
				destSeries.remove(destSeriesCollection.getXValue(this.ce.getSeriesIndex(), this.ce.getItem()));
/*				
				Day day1 = new Day(13, 6, 2007);
		        Day day2 = new Day(14, 6, 2007);

		        XYBarChartDemo7.addItem(series,day1,day2,seriesIndex-i-1);
*/		        
		        break;

			}
		}
		

	}

 

就可以实现在jfreechart中的图形的拖拽了。

 

   

微信DAT图片解密全攻略:一键转换JPG/PNG/GIF 本文详细解析了微信电脑版中DAT图片的加密原理与存储路径,并提供了从定位文件到使用专业工具进行一键解密的完整操作指南。通过简单的步骤,用户可将加密的DAT文件无损还原为JPG、PNG或GIF格式,有效解决无法直接查看聊天图片的难题,同时兼顾了隐私清理与磁盘空间管理。 阅读详情

相关推荐

ThinkPad X230魔改指南:从博通网卡驱动到1080P屏显全攻略(附Sonoma避坑清单)

本文详细介绍了ThinkPad X230的全面改造方案,包括博通网卡驱动(BCM94352HMB)的安装与调试、1080P屏幕改装技术以及macOS Sonoma系统的适配优化。通过硬件升级和软件调优,使这台经典商务本焕发新生,适合DIY爱好者和技术极客参考实践。

weixin_30379531的博客 582

通过鼠标拖动来修改JFreeChart序列值

通过鼠标拖动来修改JFreeChart序列值 最近因一个应用的需要,要通过鼠标的拖动来修改序列的值,在网上查了好多资料,都没有找到好的实现,在优快云也有不少这方面的询问贴子。在参考网上前人资料和阅读JFreeChart文档的基础,总算有了个初步的实现。发在这里,希望能对别人有点借鉴,也希望得到大家指点,进一步完善。 一 JFreeCJFreeChart的基本使用JFreeChar

WuBill的专栏 3949

OpenCV安装配置教程VS2022(超级顺利)

博主最开始没打算写这篇博客,只是想简单的在网上找一下最新版的OpenCV的安装配置教程,适用于VS2022的,但是我搜了一早上,也没搜到一个能让我成功安装配置的,看了很多很多文章,根本就没有几篇有用的。所以没办法了,只能自己研究了,于是就整理了这篇博客,希望能帮到和我一样的人,这就是博主一直信奉的利他精神!

weixin_47367099的博客 5万+

jfreechart应用--鼠标事件,popmenu,tooltip

工作过程中用到jfreechart输出两个图形,一个是柱状图,一个是曲线图。整理一下用到的几个点。 1.       创建chartpanel,之前在swt中使用jfreechart需要使用SWT_AWT进行swt和awt的桥接①。现在jfreechart中已经有直接在swt上创建的方式,类名ChartComposite②。对于第1种方式有个鼠标双击事件响应的优点。     ChartPan...

Myblog 2080

Solidworks曲面建模学习(二)——3D草图

本文主要是演示有一些零件在solidworks中通过3D草来绘制会更加方便。

东东不熬夜的博客 9500

泰凌微8258入门教程——导读

基于泰凌微TLSR8258 Bluetooth® SIG Mesh 的入门系列教程

2万+

JAVA鼠标移动显示信息_java – JFreeChart:将鼠标附近的鼠标坐标显示为提示(鼠标移动时)...

我想要的是,在XYPlot上,鼠标的坐标显示为鼠标附近的提示,当(鼠标)仅在图表上移动时!换句话说,当十字准线移动到另一个点时,坐标值的定位也会在十字准线之后移动.此外,还将绘制1条水平线和1条垂直线,它们专门与鼠标所在的点相交.这可能吗?到目前为止,我可以使用ChartMouseListener和chartMouseMoved方法获取坐标并打印在控制台上.这是我的项目以及我希望如何成为鼠标图表....

weixin_28487725的博客 741

Windows版TASSEL5的下载及安装

TASSEL5是一款用于研究表型和基因型关系的软件,由美国康奈尔大学Buckler实验室所研发。,选择Windows环境安装包下载并安装。1.安装成功后TASSEL5界面。

沉香best的博客 8188

JFreeChart当鼠标停留在热点提示自定义信息功能

当鼠标停留在数据点时,希望有提示信息显示,但是根据业务需要,我们需要自定义显示一下信息!具体功能实现如下: 首先我们要弄明白,Jfreechart鼠标提示信息显示主要是得到一个数据的map对象,该map中定义了热点的坐标及提示时显示的信息即title html或jsp中代码: <img src="Jfreechart生成的图片路径" width=800 height=400 borde...

weixin_30871701的博客 251

【论文精读】《Towards Deep Learning Models Resistant to Adversarial Attacks》

本文探讨了深度学习模型在面对对抗性攻击时的脆弱性,并提出了一种基于鲁棒优化的方法来增强神经网络的对抗鲁棒性。通过鞍点优化框架,作者提供了对抗攻击和防御机制的统一视角,并在MNIST和CIFAR-10数据集上验证了其方法的有效性。对抗训练的核心思想是将对抗样本引入训练过程,使模型能够学习到对抗样本的特征,从而提升其鲁棒性。本文通过鞍点优化框架提出了一种基于鲁棒优化的对抗训练方法,显著提升了深度学习模型的对抗鲁棒性。本文为深度学习模型的对抗鲁棒性研究提供了新的理论和实证支持,同时为未来研究指明了方向。

nmdbbzcl的博客 610

vmvare kali如何配置桥接模式进行上网

注意点:虚拟机可以PING通物理机,但是PING不通其他的网站。经过收集资料,得知由于是校园网连接,所以DHCP只能分配一个授权的IP地址给连接的主机,由于KALI是桥接物理机,物理机已经获得了这个授权的IP,所以导致桥接的虚拟机无法上网。所以不是因为配置的有问题,而是网络的安全设置导致了桥接失败。如果你是使用校园网,可以换个网络试试,使用校园网的时候,可能会遇到桥接失败。

猿小白的博客 1409

jfreechar折线图拐点注册点击事件

swing开发jfreechar折线图拐点注册点击事件概述实现代码 概述 (1)、jfreechart是一个优秀的开源chart软件。利用jfreechart可以绘制出各种丰富和优美的图形。但是在jfreechart的图上对于鼠标的支持不很充分,对于鼠标的clicked、moved、pressed、released、entered、exited的事件只支持了两个clicked和moved(不知道为什么?),幸运的是jfreechart是一个开源的软件,可以对于它的实现进行升级,在它传统的功能基础上,实现自己

falling__star的博客 472

国科大学习资料--图像处理(彭思龙、杨戈)--2020年期末考试题解析(学长整理分析)

在对20年卷子分析前,先看看19年卷子的解析(后面有20年的变化,由于从核心课调整到了普及课,20年的卷子相对简单,但是还是有很多细节) 解析:(字写的不好别嫌弃!!!!) 20年的卷子 第一题:和19年基本一致,但是加了高斯核计算费用,要算一个节省计算成本比率,所以去多看看PPT 第二题:和19年基本一致,加了证明两个高斯卷积仍然是高斯卷积,相当于19年题2和3结合 第三题:采样定理,和19年基本一致,但要注意加了证明 第四题:考了形态学提取图像边界 第五题:直方图,和19年一

无名何许人的博客 4364

6大实战技巧:掌握DBeaver数据可视化图表核心功能

你是否曾面对海量数据库查询结果却不知如何直观展示?是否在数据汇报时难以让非技术人员理解数据背后的故事?DBeaver作为一款免费通用的数据库工具,其内置的数据可视化图表功能正是解决这些痛点的利器。本文将带你深入探索DBeaver的6大图表类型,通过问题-解决方案-实践指南的三段式结构,帮助你从数据库查询到专业图表展示的完整工作流。 ## 问题识别:数据可视化中的常见挑战 在数据库开发和数据分析

gitblog_00709的博客 419

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

PHP图表制作工具集

转自:http://nedvedheqing.javaeye.com/blog/3835061. PHP扩展JpGraph:http://www.aditus.nu/jpgraph/ChartDirector:http://www.advsofteng.com/ 2. JavaScriptFlot (http://code.google.co

phper老杨 1144

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

突破仿真瓶颈:OpenRocket发动机配置实时可视化方案

在模型火箭仿真(Model Rocketry Simulation)中,发动机配置是决定飞行性能的核心参数。但OpenRocket现有界面存在三大痛点: - **信息碎片化**:推力曲线、总冲量、延迟时间等关键参数分散在不同对话框 - **操作冗余**:更换发动机需5次以上鼠标点击,效率低下 - **反馈滞后**:配置变更后需重新运行仿真才能验证效果 本文将系统介绍如何通过三大优化(数据整合、交

gitblog_07384的博客 452

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JFreeChart 不能右键保存图片解决方案

将JFreeChart放入Applet里,当通过IE浏览的时候,其它功能都正常,除了右键另存为,当点击另存为时,Java主控台会报Exception in thread "AWT-EventQueue-2" java.security.AccessControlException: access denied (java.util.PropertyPermission ...

~纹之心 213

JFreeChart 折线图中,鼠标移动上去显示坐标信息。

我们使用JFreeChart生成的折线图后,鼠标放上去可以动态显示坐标信息,但是怎么在编程中获得此横纵坐标的值呢,请高手指点。 代码如下: package jfreechart.good; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Image; i...

edmond207的博客 1373

Jfreechart中文API和属性详解

图形分解 要想绘制出漂亮的图表,就必须了解图表的构成部分,将图表进行分解成N个部分。 -------------------------------- JfreeChart 中文API --------------------------------     要想绘制出漂亮的图表,就必须了解图表的构成部分,将图表进行分解成N个部分。 然后再对每一个部分进行渲染,设置样式:包

燃烧JAVA 8938

鼠标事件中mouseClicked和mousePressd的区别

mouseClicked是鼠标点击后松开时,触发的。 mousePressd是鼠标点击是就已经触发。

youkong123的博客 2121
上一篇: 在osgi中利用service和spel实现全局常量
下一篇: 扩展jfreechart实现对于每一个bar颜色的控制
tkxing
博客等级 码龄19年 1粉丝 57原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值