Java - 如何在鼠标按钮释放后接收点坐标(JFreeChart)

2023-11-24

我使用 JFreeChart 编写了一个简单的抛物线图。当按下鼠标按钮时,我得到图形点坐标,当释放鼠标按钮时,我也想得到图形点坐标。 但图表鼠标移动按下鼠标按钮时不起作用。如何解决我的问题并在释放鼠标按钮后获取图形坐标?

这是我的代码:

package parabolademo;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

import org.jfree.chart.ChartFactory;
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.XYItemEntity;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.function.Function2D;
import org.jfree.data.function.PolynomialFunction2D;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;


public class ParabolaDemo extends ApplicationFrame {

    /*
     * @param title  the frame title.
     */
    int flag = 0;
    double delta = 0;
    double px = 0.0, py = 0.0, prx = 0.0, pry = 0.0, chartpx = 0.0, chartpy = 0.0, 
            chartX = 0.0, chartY = 0.0;
    int windowheight = 270;
    public ParabolaDemo(final String title) {

        super(title);
        double[] a = {0.0, 0.0, 1.0};
        Function2D p = new PolynomialFunction2D(a);
        double lrange = -20.0;
        double rrange = 20.0;
        XYDataset dataset = DatasetUtilities.sampleFunction2D(p, lrange, rrange, 1000, "y = f(x)");
        double max = 0.0;

        if (a[2] < 0) {
            max = p.getValue(-a[1] / 2*a[2]);
        }
        else {
            if (p.getValue(lrange) > p.getValue(rrange))
                max = p.getValue(lrange);
            else
                max = p.getValue(rrange);
        }
        System.out.println("max = " + max);
        delta = max / 16.4;

        final JFreeChart chart = ChartFactory.createXYLineChart(
            "Parabola",
            "X", 
            "Y", 
            dataset,
            PlotOrientation.VERTICAL,
            true,
            true,
            false
        );

        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.addMouseListener(new CustomListener());
        chartPanel.addChartMouseListener(new ChartMouseListener() {

            @Override
            public void chartMouseClicked(ChartMouseEvent cme) {

            }

            @Override
            public void chartMouseMoved(ChartMouseEvent cme) {
                ChartEntity ce = cme.getEntity();
                if (ce instanceof XYItemEntity) {
                    XYItemEntity e = (XYItemEntity) ce;
                    XYDataset d = ((XYItemEntity) ce).getDataset();
                    int i = ((XYItemEntity) ce).getItem();
                    chartpx = d.getXValue(0, i);
                    chartpy = d.getYValue(0, i);
                    //System.out.println("X:" + chartpx + ", Y:" + chartpy);
                }
                Point2D po = chartPanel.translateScreenToJava2D(cme.getTrigger().getPoint());
                Rectangle2D plotArea = chartPanel.getScreenDataArea();
                XYPlot plot = (XYPlot) chart.getPlot(); // your plot
                chartX = plot.getDomainAxis().java2DToValue(po.getX(), plotArea, plot.getDomainAxisEdge());
                chartY = plot.getRangeAxis().java2DToValue(po.getY(), plotArea, plot.getRangeAxisEdge());
                System.out.println("X:" + chartX + ", Y:" + chartY);
            }
        });
        chartPanel.setPreferredSize(new java.awt.Dimension(500, windowheight));
        chartPanel.setDomainZoomable(false);
        chartPanel.setRangeZoomable(false);
        setContentPane(chartPanel);
    }

    public static void main(final String[] args) {

        final ParabolaDemo demo = new ParabolaDemo("Parabola Plot Demo");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }


    public class CustomListener implements MouseListener {

          public void mouseClicked(MouseEvent e) {

          }

          public void mouseEntered(MouseEvent e) {

          }

          public void mouseExited(MouseEvent e) {

          }

          public void mousePressed(MouseEvent e) {
              flag = 1;
              px = chartpx;
              py = chartpy;
              System.out.println("Mouse Pressed! xpos = " + px + "; py = " + py);
          }

          public void mouseReleased(MouseEvent e) {
              flag = 1;
              prx = chartX;
              pry = chartY;
              System.out.println("Mouse Released! xpos = " + prx + "; py = " + pry);
          }
     }
}

提前致谢!


如图所示here, ChartPanel使用单击-拖动-释放手势来处理缩放;setMouseZoomable(false)并没有改变这一点。

根据显示的建议进行工作here,下面的完整示例打印任何单击点的坐标。我放大了系列形状,以便更容易看到效果。另外,应该构造和操作 Swing GUI 对象only on the 事件派发线程.

image

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Rectangle;
import org.jfree.chart.ChartFactory;
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.XYItemEntity;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.function.Function2D;
import org.jfree.data.function.PolynomialFunction2D;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.util.ShapeUtilities;

public class ParabolaDemo extends ApplicationFrame {

    /*
     * @see https://stackoverflow.com/a/20107935/230513
     * @see https://stackoverflow.com/q/20081801/230513
     */
    public ParabolaDemo(final String title) {

        super(title);
        double[] a = {0.0, 0.0, 3.0};
        Function2D p = new PolynomialFunction2D(a);
        XYDataset dataset = DatasetUtilities.sampleFunction2D(
            p, -20.0, 20.0, 20, "y = 3x² {-20…20}");
        final JFreeChart chart = ChartFactory.createXYLineChart("Parabola",
            "X", "Y", dataset, PlotOrientation.VERTICAL, true, true, false);
        final XYPlot plot = (XYPlot) chart.getPlot();
        XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
        r.setBaseShapesVisible(true);
        r.setSeriesShape(0, ShapeUtilities.createTranslatedShape(
            new Rectangle(12, 12), -6, -6));
        final ChartPanel chartPanel = new ChartPanel(chart) {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(640, 480);
            }
        };
        chartPanel.addChartMouseListener(new ChartMouseListener() {

            @Override
            public void chartMouseClicked(ChartMouseEvent cme) {
                report(cme);
            }

            @Override
            public void chartMouseMoved(ChartMouseEvent cme) {
                //report(cme);
            }

            private void report(ChartMouseEvent cme) {
                ChartEntity ce = cme.getEntity();
                if (ce instanceof XYItemEntity) {
                    XYItemEntity e = (XYItemEntity) ce;
                    XYDataset d = e.getDataset();
                    int s = e.getSeriesIndex();
                    int i = e.getItem();
                    System.out.println("X:" + d.getX(s, i) + ", Y:" + d.getY(s, i));
                }
            }
        });
        setContentPane(chartPanel);
    }

    public static void main(final String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                final ParabolaDemo demo = new ParabolaDemo("Parabola Demo");
                demo.pack();
                RefineryUtilities.centerFrameOnScreen(demo);
                demo.setVisible(true);
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - 如何在鼠标按钮释放后接收点坐标(JFreeChart) 的相关文章

  • JNA - EnumProcessModules() 未返回所有 DLL?

    我试图从游戏中读取坐标 当我在通过 OpenProcess 接收的 HANDLE 上使用 ReadProcessMemory 以及我在 CheatEngine 中找到的内存时 效果非常好 例如 如果我知道正在运行的进程中的浮点值是0x5AB
  • Java中RandomAccessFile的并发

    我正在创建一个RandomAccessFile对象通过多个线程写入文件 在 SSD 上 每个线程都尝试在文件中的特定位置写入直接字节缓冲区 并且我确保线程写入的位置不会与另一个线程重叠 file getChannel write buffe
  • 检查发送到网页的请求数

    我正在编写一个 Java 多线程应用程序 它可以访问不同 Web 服务器的数百万个 有时甚至数十亿个 URL 这个想法是检查这些 URL 是否给出有效的 200OK 响应或 404 其他代码 我如何知道我的程序是否不会在他们的服务器上造成高
  • Active MQ - HelloWorld 示例异常

    我正在尝试运行 hello world 示例在这里找到 http activemq apache org hello world html I added activemq all 5 5 1 jar已经到图书馆了 它构建成功 但出现以下警
  • 初始堆大小无效。无法创建Java虚拟机

    我遇到了下一个问题 我尝试通过startup bat手动启动Tomcat 但似乎没有显示任何结果 然后我尝试运行shutdown bat 控制台显示如下 D apache tomcat 7 0 35 bin gt startup bat U
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • 按文件名过滤 eclipse 中的警告

    我们使用 Eclipse 进行 Java 开发 并使用 Maven 将 JSP 编译成 servlet 以便在嵌入式 Jetty 实例中使用 这意味着要从 Eclipse 运行该项目 我必须包含 target jsp source 作为源文
  • 如何导入 Java 密钥库中现有的 X.509 证书和私钥以在 SSL 中使用?

    我在 ActiveMQ 配置中有这个
  • 为什么下面代码的输出是Thread[main,5,main]

    public class test1 public static void main String args TODO Auto generated method stub Thread t Thread currentThread Sys
  • 为什么我要使用责任链而不是 switch 语句

    考虑一下您已经获得了多次验证 仅当要检查的对象属于某种类型时 这些验证才应生效 为什么我要使用责任链而不是 switch 语句 责任链示例 public class Executor Inject private ValidatorFact
  • 如何使用 Selenium 中的索引切换到窗口

    由于selenium不提供切换到窗口 多个窗口 的方法 但我想使用index html自定义方法来切换到不同的窗口 但下面的代码没有按预期工作 请建议以下方法的最佳实施 public void switchToWindowIndex int
  • “___ 中的方法 ___() 是在无法访问的类或接口中定义的”编译错误

    我发现了一个奇怪的编译限制 我无法解释 并且我不明白这个限制的原因 示例1 考虑这些类 In package e1 public class C1 enum E1 A B C public E1 x In package e2 import
  • 如何在Java中模拟引用传递?

    我是一个十足的 Java 菜鸟 我知道 Java 将所有参数视为按值传递 并且还有其他几个线程人们对此进行了解释 例如 在 C 中我可以这样做 void makeAThree int n n 3 int main int myInt 4 m
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • 在 REST Web 服务中接受逗号分隔值

    我正在尝试接收 REST URI 中以逗号分隔值形式的字符串列表 示例 http localhost 8080 com vogella jersey first rest todo test 1 abc test 其中 abc 和 test
  • 如何使 JScrollPane 与嵌套 JPanel 一起正常工作?

    我正在使用 NetBeans 在 Java 中构建 Swing 应用程序 但我遇到布局问题 我的主框架包含一个JScrollPane其中包含一个JPanel called contentPanel其中又包含一个JPanel called l
  • Struts2中的变量声明

    Struts2中如何声明变量并为该变量赋值 使用设置标签
  • AndroidAnnotations 和 Dagger

    我正在尝试使用 Dagger 注入 Android 带注释的 Activity java lang IllegalArgumentException No inject registered for members com app serv
  • 使用正则表达式匹配阿拉伯文文本

    我试图使用正则表达式仅匹配阿拉伯语文本 但出现异常 这是我的代码 txt matches P Arabic 这是例外情况 线程 main 中的异常 java util regex PatternSyntaxException 索引 9 附近
  • 使用 PDFBox 在 Android 中创建 PDF

    我正在尝试通过我的 Android 应用程序创建 PDFPDFBoxapi 但出现以下错误 java lang NoClassDefFoundError org apache pdfbox pdmodel PDDocument 我已经将以下

随机推荐

  • 获取列名的 LINQ 成员表达式

    Hello 我正在将 LINQ 和 EF 与 C 4 0 一起使用 我已将基本的 ELMAH 表拖入 EF 多次构建和保存 一切都如人们所期望的那样进行 但尝试过于雄心勃勃 需要一点帮助 我试图从作为变量传入的表达式中获取列名称 我想要的是
  • 如何查找Java + JNI + C++进程中的内存泄漏

    我有一个用 java 编写的项目 使用 JNI 使用 C 库 所有的代码都是我们写的 所以我有所有的源代码 几个小时后 机器内存不足 尽管我的进程只是迭代文件 并且删除了与前一个文件相关的所有内存 我确信存在内存泄漏 通常我使用Valgri
  • 用于搜索专利数据库(即 USPTO 或 EPO)的 Python 模块

    对于我的工作 我必须寻找生物医学研究和工业领域的潜在客户 我使用模块 biopython 编写了一些非常方便的程序 它有一个很好的用于搜索 NCBI 的界面 我还使用了 Clinical Trials 模块来搜索 ClinicalTrial
  • 如何使用 JSDoc3 记录嵌套命名空间

    我在使用 JSDoc3 记录按照这些方式构建的代码时遇到问题 namespace MyNamespace MySubNamespace function MyNamespace MyNamespace MySubNamespace Foo
  • R 中发现的任何错误都会响应 Error in app$vspace(new_style$`margin-top` %||% 0) : attempts to apply non-function

    老实说 我不知道如何使其可重现 使用 tidyverse 在 R 中发生的任何错误都会抛出 Error in app vspace new style margin top 0 attempt to apply non function 还
  • Python asyncio 不显示任何错误

    我正在尝试使用 asyncio 从数千个网址中获取一些数据 以下是设计的简要概述 填写一个Queue使用一个单一的一次性处理一堆网址Producer 产生一堆Consumers Each Consumer保持异步地从 中提取 urlQueu
  • 如何使用 Docker 获取入口点脚本?

    我有一个 Docker 镜像 我可以运行它 docker run it entrypoint bin bash gcr io docker tag 然后我可以通过以下方式获取脚本 root 86bfac2f6ccc source entry
  • 我应该在 Pygame 中使用什么 gui 工具包? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在制作一款游戏 需要能够在 pygame 界面中弹出 gui 元素 This问题不是我想要的 因为 wxPython 围绕 SDL 表面 而不是
  • 将值 NA 替换为 R 中另一列的值

    我想根据列年份将 dfABy 中 A 列中的 NA 值替换为 B 列中的值 例如 我的 df 是 gt dfABy A B Year 56 75 1921 NA 45 1921 NA 77 1922 67 41 1923 NA 65 192
  • 工作区无法加载到服务器中,文件具有幻数“RDX3”

    我一直在浏览其他 SO 帖子 我发现人们以前也遇到过与我类似的问题 然而 就我而言 当我在 RStudio 中加载 RData 工作区时 它工作得很好 但是 当我尝试将其加载到服务器中时 出现以下错误 加载错误 文件 home ubuntu
  • NSString 属性:复制还是保留?

    假设我有一个名为SomeClass with a string物业名称 interface SomeClass NSObject NSString name property nonatomic retain NSString name e
  • 从 yuv 420 转换为 image

    我有包含 yuv420 数据的字节数组 byte yuv420 yuv data 我怎样才能将其转换为Image
  • 如何在 Swift 中表示通用 JSON 结构?

    我想在 Swift 中表示一个通用的 JSON 对象 let foo String Any foo 1 bar baz But the String Any 编译器建议的类型并不能很好地工作 例如 我无法检查该类型的两个实例是否相等 而这对
  • Hadoop“无法为您的平台加载本机 hadoop 库”警告

    我目前正在运行的服务器上配置hadoopCentOs 当我跑步时start dfs sh or stop dfs sh 我收到以下错误 警告 util NativeCodeLoader 无法加载本机 hadoop 库 您的平台 在适用的情况
  • 片段内的图像 GridView

    我在iOS上开发之后 刚刚开始在android平台上开发 我环顾四周 似乎无法弄清楚 我试图在选择操作栏中的选项卡后显示网格视图 该片段通过控制选项卡栏的主要活动进入视图 我认为问题可能与传递上下文有关 但我不确定 这是我的MainActi
  • 将我的应用程序生成的所有声音记录在音频文件中(不是来自麦克风)

    我有一个像仪器一样的屏幕 有播放声音文件的按钮 我想将用户按下按钮时播放的声音录制到单个音频文件中 以便我可以将该文件保存为 mp4 或其他音频格式 您能指导我如何以简单的方式实现这一目标吗 我可以使用麦克风进行录音AVAudioRecor
  • IFRAME 和 iPad 上的 Safari,用户如何滚动内容?

    根据 Apple iOS 的口头禅 应该可以通过用两根手指拖动来滚动 IFRAME 的内容 不幸的是 在 iPad 上运行最新版本的 iOS 时 我还没有找到一个带有使用这种方法滚动的 IFRAME 的网站 也没有出现滚动条 有谁知道用户应
  • Python 子进程安全

    我理解为什么如果您有不受信任的输入 使用 shell True 可能会带来安全风险 但是 我不明白 shell False 如何避免同样的风险 大概如果我想允许用户提供输入 他可能会输入 var rm rf 我的代码可能只是 subproc
  • 如何使用python和beautifulsoup解析html表并写入csv

    我尝试解析 html 页面并获取货币值并写入 csv 我有以下代码 usr bin env python import urllib2 from BeautifulSoup import BeautifulSoup contenturl h
  • Java - 如何在鼠标按钮释放后接收点坐标(JFreeChart)

    我使用 JFreeChart 编写了一个简单的抛物线图 当按下鼠标按钮时 我得到图形点坐标 当释放鼠标按钮时 我也想得到图形点坐标 但图表鼠标移动按下鼠标按钮时不起作用 如何解决我的问题并在释放鼠标按钮后获取图形坐标 这是我的代码 pack