天道酬勤,学无止境

JFreeChart 选择一个区域而不缩放(JFreeChart select an area without zooming)

问题

我最近开始使用 JFreeChart,我想做一些事情,但我不确定是否可行。 我的程序应该从 wav 文件中绘制频谱图(声音图)。 所以我设法从双数组列表中的 wav 文件中获取数据并将其显示在图表中。 但是现在我希望能够在不缩放的情况下选择我的频谱图的一个区域(使用用于缩放的相同工具),并且能够在我的声音中只播放选定的部分。 但我根本找不到任何成功的方法。 这是我的图表代码:

    package classes;

import java.awt.Color;
import java.awt.Paint;
import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.RectangleInsets;

public class Chart{
    JFreeChart chart;
    Plot plot;

    //Constructeur de la classe Chart
    public Chart(double[][] bs, int channel, int framesLength, float frameRate)
    {
        // Création d'un XY chart
        XYSeries series = new XYSeries("XYGraph");
        int i=0,j=0;
        float k=0;
        //Ajout de tous les points du tableau de 16 bytes dans le chart
        for( i=0; i <channel;i++)
        {
            for(j=0; j< framesLength;j++)
            {
                //Division des valeurs par 2^15 pour être entre 1 et -1
                series.add(k, (bs[i][j]/32768));
                //Echelle de X
                k+=(1/frameRate);
            }
        }
        // Ajoute la série au dataset
        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series);
        // Génération du graphe
        chart = ChartFactory.createXYLineChart(
        "Ajouter titre à la fonction de génération", // Titre
        "Temps (s)", // Nom de l'axe X
        "y-axis", // Nom de l'axe Y
        dataset, // Dataset
        PlotOrientation.VERTICAL, // Plot Orientation
        true, // Show Legend
        false, // Use tooltips
        false // Configure chart to generate URLs?
        );
        plot= (XYPlot) chart.getPlot();

    }
    //Renvoie le chart
    public JFreeChart getChart()
    {
        return chart;
    }

    public void color(Color c)
    {
        plot.setBackgroundPaint(c);
    }
}

在这里,我正在调用 Chart 类并使用它:

Chart chartUn= new Chart(bs, channels  , frameLength , frameRate);
        chartUn.color(Color.pink);
        vue.setChartPanelUn(new ChartPanel(chartUn.getChart(), false));
        vue.getChartPanelUn().setRangeZoomable(false);
        vue.getChartPanelUn().setMouseWheelEnabled(true);

vue.getChartPanelUn() 返回一个 ChartPanel。 你能知道如何解决我的问题吗? 非常感谢(对不起,如果我的英语并不总是准确的:/)

回答1

不要通过缩放来做到这一点,使用添加到ChartPanelMouseListenerMarker添加到Domain轴。

在这个例子中,我对MouseAdapter进行了子类MouseAdapter这样当你按下鼠标时,域值被捕获( markerStart ),当你释放鼠标结束位置时更新('markerEnd')并且一个标记被添加到绘图中( updateMarker

然后你会得到一个这样的图表:

带域标记的图表

请注意,在此示例中,我实际上关闭了缩放功能。

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.IntervalMarker;
import org.jfree.chart.plot.Marker;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.Layer;


public class MouseMarkerDemo extends JFrame {


    public MouseMarkerDemo(String title) {
        super(title);
        JPanel chartPanel = createDemoPanel();
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);
    }


    private final static class  MouseMarker extends MouseAdapter{
        private Marker marker;
        private Double markerStart = Double.NaN;
        private Double markerEnd = Double.NaN;
        private final XYPlot plot;
        private final JFreeChart chart;
        private  final ChartPanel panel;


        public MouseMarker(ChartPanel panel) {
            this.panel = panel;
            this.chart = panel.getChart();
            this.plot = (XYPlot) chart.getPlot();
        }

        private void updateMarker(){
            if (marker != null){
                plot.removeDomainMarker(marker,Layer.BACKGROUND);
            }
            if (!( markerStart.isNaN() && markerEnd.isNaN())){
                if ( markerEnd > markerStart){
                    marker = new IntervalMarker(markerStart, markerEnd);
                    marker.setPaint(new Color(0xDD, 0xFF, 0xDD, 0x80));
                    marker.setAlpha(0.5f);
                    plot.addDomainMarker(marker,Layer.BACKGROUND);
                }
            }
        }

        private Double getPosition(MouseEvent e){
            Point2D p = panel.translateScreenToJava2D( e.getPoint());
            Rectangle2D plotArea = panel.getScreenDataArea();
            XYPlot plot = (XYPlot) chart.getPlot();
            return plot.getDomainAxis().java2DToValue(p.getX(), plotArea, plot.getDomainAxisEdge());
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            markerEnd = getPosition(e);
            updateMarker();
        }

        @Override
        public void mousePressed(MouseEvent e) {
            markerStart = getPosition(e);
        }
    }

    private static XYDataset createDataset() {

        XYSeries series1 = new XYSeries("Data");
        series1.add(1.0, 1.0);
        series1.add(2.0, 4.0);
        series1.add(3.0, 3.0);
        series1.add(4.0, 5.0);
        series1.add(5.0, 5.0);
        series1.add(6.0, 7.0);
        series1.add(7.0, 7.0);
        series1.add(8.0, 8.0);

        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series1);
        return dataset;

    }


    private static JFreeChart createChart(XYDataset dataset) {

        JFreeChart chart = ChartFactory.createXYLineChart(
            "Mouse Marker",
            "X",
            "Y",
            dataset,
            PlotOrientation.VERTICAL,
            true,
            true,
            false
        );
        XYPlot plot = (XYPlot) chart.getPlot();
        plot.setDomainPannable(true);
        plot.setRangePannable(true);
        XYLineAndShapeRenderer renderer
                = (XYLineAndShapeRenderer) plot.getRenderer();
        renderer.setBaseShapesVisible(true);
        renderer.setBaseShapesFilled(true);
        return chart;
    }

    public static JPanel createDemoPanel() {
        final JFreeChart chart = createChart(createDataset());
        final ChartPanel panel = new ChartPanel(chart);
        panel.setRangeZoomable(false);
        panel.setDomainZoomable(false);
        panel.addMouseListener(new MouseMarker(panel));
        return panel;
    }

    public static void main(String[] args) {
        MouseMarkerDemo demo = new MouseMarkerDemo("JFreeChart: MouseMarkerDemo.java");
        demo.pack();
        demo.setVisible(true);
    }

}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 具有可选域轴和缩放的JFreeChart(JFreeChart with selectable domain axis and zoom)
    问题 如何使用https://www.amcharts.com/demos/line-chart-with-scroll-and-zoom/这样的图表 我对这些功能特别感兴趣 为了能够使用这两个选择控件选择域轴的窗口。 为了能够通过选择部分域轴进行缩放。 为了能够缩小并查看大图。 为了能够映射到范围轴(Y)并在任何点(没有标记)像工具提示一样查看该气球上的值 我在这里尝试了可滚动的JFree域轴和自定义标记标签,并通过垃圾桶使域可滚动。 我仍然缺少这些功能,无法有效使用图形。 回答1 您必须结合几种方法: 平移控件:调用setDomainPannable(true)以启用平移; 在控件中,使用panDomainAxes(),如mouseDragged()的实现所示。 按照此处的建议使用鼠标。 缩放:不支持通过在轴上拖动来缩放,但是支持在绘图上拖动; 向右拖动以查看选择矩形。 为确保鼠标滚轮在滚动时仅缩放域轴,请在ChartPanel上调用setRangeZoomable(false) ; 反之亦然。 缩小:向左拖动以缩小或使用按钮处理程序,如下所示。 工具提示:在所选的ChartFactory启用工具提示。 如果需要,请创建一个自定义XYToolTipGenerator ,如下所示。
  • 如何通过鼠标拖动禁用缩放而不在jfreechart中通过鼠标滚轮侦听器禁用?(How to disable zoom by mouse dragged without disabling by mousewheellistener in jfreechart?)
    问题 我想通过鼠标拖动(绘制该矩形)禁用缩放,但不禁用 MouseWheel 缩放。 我在另一个主题中找到了如何在向左拖动鼠标时禁用缩放重置 (restoreAutoBounds),我对如何解决这个问题很感兴趣。 有没有什么捷径可以做到这一点? 回答1 好的,我已经完成了,通过覆盖 MouseWheelListener。 在 chartPanel.setMouseZoomable(false) 之后: chartPanel.addMouseWheelListener(new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent arg0) { if (arg0.getWheelRotation() > 0) { chartPanel.zoomOutDomain(0.5, 0.5); } else if (arg0.getWheelRotation() < 0) { chartPanel.zoomInDomain(1.5, 1.5); } } }); zoom(In/Out)Domain,因为我只想重新缩放域轴。 回答2 上一个答案中的鼠标滚轮侦听器实现删除了缩放动画,并且不会从当前鼠标位置进行缩放。 我通过使用透明涂料隐藏矩形找到了一种解决方法: chartPanel
  • JFreeChart select an area without zooming
    I recently started using JFreeChart and there is something i would like to do but i'm not sure if it's possible. My program is supposed to draw a spectrogram (a sound graph) from a wav file. So i managed to get the data from my wav file in a double arraylist and to display it in a chart. But now i would like to be able to select an area of my spectrogram (with the same tool used for zooming) without zooming and to be able to play only the selected part on my sound. But i simply can't find any way to succeed. Here is my code of my chart: package classes; import java.awt.Color; import java.awt
  • JFreeChart的放大和缩小功能的异常行为?(Abnormal Behaviour of the Zoom In and Zoom Out Functionality of the JFreeChart?)
    问题 我观察到,“放大”和“缩小”的功能与预期的实现方式大不相同。例如,当我执行“缩小”一步时,然后又退回到“放大”在”。 我再也看不到原始图。 我看不到JFreechart的“放大”和“缩小”功能处于同步状态。 public class ChartPanelDemo { private static final String title = "Historical Data Graph"; private ChartPanel chartPanel = createChart(); private JButton ZoomX; private JButton ZoomY; private JButton Zoom; private JButton ZoomXOut; private JButton ZoomYOut; private JButton ZoomOut; private JButton originalGraph; private JButton xscaleInc; private JButton xscaleDec; private NumberAxis domainAxis; private NumberAxis rangeAxis; private int UNITS = 1; private static final int COUNT = 100
  • JFreeChart with selectable domain axis and zoom
    How to have chart like https://www.amcharts.com/demos/line-chart-with-scroll-and-zoom/ I am specifically interested in these functionalities To be able to select window of domain axis with those 2 selection controlls. To be able to zoom by selecting portion of domain axis. To be able to zoom out and see the bigger picture. To be able to map to range axis (Y) and see the value on that balloon like tool tip at any point (without Marker) I made initial attempt here Scrollable JFree domain axis and custom marker label with help of trashgod I made domain scrollable. I am still missing these
  • 将其显示为可见后,如何更新JFreeChart的外观?(How can I update a JFreeChart's appearance after it's been made visible?)
    问题 将图表变为可见后,如何使用JFreeChart动态更新图表的外观? 回答1 ChartPanel类对此非常方便,因为它具有控制图表整体外观(包括属性和缩放状态)的方法。 此外,还可以访问图表的组件,如下所示。 此相关示例说明了缩放按钮的JToolBar 。 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.NumberFormat; import javax.swing.AbstractAction; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree
  • How to disable zoom by mouse dragged without disabling by mousewheellistener in jfreechart?
    I would like to disable zooming by mouse dragging(which paints that rectangle), but not disable zooming by MouseWheel. I found in another topic how to disable zoom reset while dragging mouse to left (restoreAutoBounds) and I'm interested in how to solve this problem. Is there a little shortcut to do that?
  • 避免在时间序列一维绘图中项目标签重叠(JFreeChart)(Avoid item label overlap in time series 1D plots (JFreeChart))
    问题 我正在尝试找到生成带有标签的基于1D时间的绘图的最佳策略。 当前看起来像这样: 问题在于时间跨度很少发生,而其他时间间隔则密度很高。 我要实现的是扭曲时间轴,以便在密集区域中将标签隔开以避免重叠。 或者,我可以想象显示没有轴失真的实际数据点,但要分配标签,使它们不重叠。 编辑:这是我尝试手动清理混乱,以了解我想要的输出: 回答1 您可以使用setDomainPannable()和setMouseWheelEnabled()尝试平移和缩放的某种组合,在此处和此处看到。 右键单击以查看上下文菜单,然后按住Control键单击以平移(在Mac OS X上按住Option键单击)。
  • 具有多个类别的Boxplots的JFreeChart缩放(JFreeChart scaling of Boxplots with several Categories)
    问题 我目前正在使用JFreeChart显示框线图的基于Java的项目。 我的问题是如何显示包含带有大约20个类别和5个以上系列的CategoryDataset的箱形图的图表。 当前,如果未设置ChartPanel的首选大小,则图例,标签和注释可读,但Boxplots太小。 或设置ChartPanel的大小,以使Boxplots具有可接受的大小,然后水平拉伸图例,标签和注释。 我的问题是,如何在不缩放图例,图轴标签和图表注释的情况下正确缩放框线图? 是否可以在不缩放图表所有元素的情况下缩放图表? 程式码范例 import java.awt.Color; import java.awt.Dimension; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import javax.swing.JFrame; import javax.swing.JScrollPane; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.NumberAxis
  • JFreeChart - Java 堆空间问题(JFreeChart - Java Heap Space issue)
    问题 我第一次使用 JFreeChart,我正在使用 TimeSeriesCollection() 创建一个 TimeSeriesChart。 我来自数据库查询的 reslutset 是 app。 约 1000 条记录。 我正在使用org.jfree.date.time.Minute.Minute(int min.....)对象将其添加到 TimeSeries 对象。 我有一个 JFrame,我直接在上面添加了 ChartPanel。 用户将提供新的输入参数并使用新数据集重新加载图表数据。 所以我在每次重新加载之前通过在方法中调用以下内容进行清理 dataset.removeAllSeries(); chart.removeLegend(); chart.getRenderingHints().clear(); cp.getChartRenderingInfo().setEntityCollection(null); cp.removeAll(); cp.revalidate(); 输出是完美的。 但我注意到,在“在 Eclipse 中多次”运行程序后,我看到了以下有关 Java 堆空间的错误消息。 有时我也在任务管理器中看到,即使数据集非常小(100 条记录),程序也会占用 PC 内存。 Exception occurred during event dispatching
  • Abnormal Behaviour of the Zoom In and Zoom Out Functionality of the JFreeChart?
    I have observed that the functionality of the "Zoom-In" and "Zoom-out" was implemented quite different than expected.Like for example when i do one step "Zoom-out" and then again after one step back of "Zoom-In". I couldn't see the Original graph again. I don't see "Zoom-In" and "Zoom-out" functionality of JFreechart to be in the sync. public class ChartPanelDemo { private static final String title = "Historical Data Graph"; private ChartPanel chartPanel = createChart(); private JButton ZoomX; private JButton ZoomY; private JButton Zoom; private JButton ZoomXOut; private JButton ZoomYOut
  • CombinedDomainXYPlot不重新缩放域轴(CombinedDomainXYPlot not rescaling domain axis)
    问题 当我从使用CombinedDomainXYPlot的图表中隐藏系列数时,所有范围轴都会很好地自动缩放。 但是,域轴不会重新缩放。 有什么方法可以手动刷新缩放比例,或者可能缺少在此设置中启用域轴自动缩放设置的设置? 回答1 CombinedDomainXYPlot在getDataRange()为其共享域轴建立组合的最大Range 。 这是允许共享轴所需的。 更改系列的可见性不会对共享域轴产生任何影响。 更改Dataset将通过其configure()方法更新共享域轴。 无论哪种情况,子图的范围轴都可以独立更新。 下面的示例允许您独立更新子图或更改系列的可见性。 中断configure()以查看效果。 您对setAutoRange ()进行切换的建议可以替换为一次对configure()调用; 但效果应为零,因为数据及其组合的最大Range不变。 mainPlot.getDomainAxis().configure(); 若要自动更新共享域轴,请使用addSeries()或removeSeries()而不是setSeriesVisible() 。 顺便说一句,不要忽略初始线程和pack() 。 import java.awt.*; import java.awt.event.ActionEvent; import java.util.Random; import javax
  • Java jfreechart stick scatterplot?
    I am using jfreechart at the moment and want to generate a kind of scatterplot. I have 100000s of datapoints. Now I want to change each 2D point into a (3D-) stick by usind the points z-value as the stick height. The whole plot should be zoomable! Thats it. Is this possible in jfreechart? How can I do this without bucking or delay within the zooming action? Thanks for any suggestions! Achim
  • 带有 JFreeChart 的热图(HeatMaps with JFreeChart)
    问题 我有一个点 (x,y) 的数据集,我想创建这个数据集的热图。 更具体地说,我想要一张图像,其中我在点集中的区域颜色较浅,而在点较少的区域颜色较深。 我正在使用 JFreeChart 库,我发现了一些类,例如 DefaultHeatMapDataset,但我不确定如何以正确的方式使用它们。 有没有人知道如何做到这一点? 提前致谢! 乔万尼 回答1 将 XYBlockRenderer 与 XYZDataset 的合适实现和 PaintScale 的相应实现结合使用。 回答2 在 JFreeChart 中创建热图有点棘手,因为(从 1.0.19/1.5.0 版本开始)仍然没有图表类型。 此用例的绘图。 (可用的 HeatMapDataset 是为了与HeatMapUtilities一起使用而HeatMapUtilities正如 David Gilbert 在论坛中所写的那样。) 所以创建热图的最佳方法是使用带有 XYBlockRenderer 和 XYZDataset 的 XYPlot,正如垃圾神已经写的那样。 这是一个完整的简约示例,您可以运行该示例以获得如下所示的图表: import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.*
  • jfreechart: Gantt Chart Task Label Font Size
    I put my Gantt Chart (ChartPanel) in a JScrollPane,and create a button named [zoom in]. The function for the button [zoom in] is: When I click [zoom in] button, the width of chart panel will be doubled. newSize = originalChartWidth * 2; chartPanel.setPreferredSize(new java.awt.Dimension(newSize, 1000)); After click [zoom in] button, the scroll bar of JScrollPane will be appeared. Then the user can scroll to watch the whole chart after zoom in. But there is a problem, When I double the chart panel width, The Task Label Font will be enlarged too. Before zoom in After zoom in (The font will be
  • Java Swing - JFreeChart app works slowly
    I create JFreeChart program that can: move points of splines don't allow to cross black splines (boundary splines) create new splines in real-time (as Grapher) mouse wheel zoom For adding new series to dataset I use this function: public static XYSeriesCollection createSplineDataset(File[] polFiles) { dataset = new XYSeriesCollection(); for (File polFile : polFiles) { XYSeries series = new XYSeries(polFile.getName()); Scanner s = null; try { s = new Scanner(new File(polFile.getAbsolutePath())); }catch (FileNotFoundException ex) { System.out.println("Scanner error!"); } s.useLocale(Locale.US)
  • 多个轴在同一数据上(Multiple axes on the same data)
    问题 我试图在相同的数据上有两个轴。 数据是几个DefaultTableXYDatasets 。 该图是一个XYPlot ,我有两个XYLineAndShapeRenderers和一个StackedXYAreaRenderer2 。 对于y值,所有数据均以米为单位,我希望有一个轴以米为单位显示它,以轴为单位以英尺为单位显示它。 现在,这感觉很普通,但是我无法确定最明显的方法。 一种有效的方法是复制数据并以英尺为单位设置y值,然后添加另一个NumberAxis并完成处理。 但是我认为最好NumberAxis子类,或者将一些功能注入NumberAxis以缩放值。 还是我应该采用第一种方法? 你怎么看? 回答1 最终,我决定采用这种解决方案,它可能不是最优雅的,但它确实有效。 我有一个第二轴线feetAxis ,并增加了一个AxisChangeListener上称为第一轴线meterAxis 。 当meterAxis更改时,将范围设置为feetAxis 。 我使用了SwingUtilities.invokeLater ,否则缩小图表时范围将是不正确的,那么feetAxis只会从0变为1。 feetAxis = new NumberAxis("Height [ft]"); metersAxis = new NumberAxis("Height [m]"); pathPlot
  • JFreeChart x轴刻度(JFreeChart x axis scale)
    问题 我有一个始终从x = 0开始的JFree XY折线图。然后,根据属性文件中用户定义的设置,应用程序将根据该数字(以分钟为单位)递增。 例如,x = 0开始时,用户定义的设置为5,因此刻度变为0、5、10、15、20…,或者用户设置为3,因此变为0、3、6、9、12…非常简单。 我遇到的问题是图表开始的方式。 如果我从0开始,则0在图的中间,而不是在左下角的-0.0000005,-0.000004,-0.000003…0.000000,0.000001,0.000002…0.000005 如何仅在底部手动添加比例,即定义比例应为2增量,然后再进行维护? 回答1 您应该使用NumberAxis,它包含许多方法来定义图表的比例。 例子 : // Create an XY Line chart XYSeries series = new XYSeries("Random Data"); series.add(1.0, 500.2); series.add(10.0, 694.1); XYSeriesCollection data = new XYSeriesCollection(series); JFreeChart chart = ChartFactory.createXYLineChart("XY Series Demo", "X", "Y", data
  • JFreeChart - Java Heap Space issue
    I am using JFreeChart for the first time and I am using a TimeSeriesCollection() to create a TimeSeriesChart. My reslutset from the DB query is app. aroung 1000 records. I am using org.jfree.date.time.Minute.Minute(int min.....) object to add it to a TimeSeries object. I have a JFrame on which I add the ChartPanel directly. The user will provide new input parameters and reload the chart data with new dataset. So I clean up before every reload by calling the following in a method dataset.removeAllSeries(); chart.removeLegend(); chart.getRenderingHints().clear(); cp.getChartRenderingInfo()
  • JFreeChart MouseListener无法解析图表元素(JFreeChart MouseListener doesn't resolve chart elements)
    问题 我有堆叠的条形图,我想在其中能够选择堆叠中的单个条形图。 但是ChartMouseListener不会将ChartMouseEvent解析为相应的ChartEntity。 这是听众的片段: public void chartMouseClicked(ChartMouseEvent event){ ChartEntity entity = event.getEntity(); if(entity != null && (entity instanceof XYItemEntity) ){ XYItemEntity item = (XYItemEntity)entity; renderer.select(item.getSeriesIndex(), item.getItem()); return; } // deselect renderer.select(-1,-1); } 问题是当我显然单击某些栏时event.getEntity()返回null。 请注意,并非所有障碍都失败了。 我越靠近图表的右端,坐标移位就越明显。 下面的快照显示了在所选栏外单击时实际显示的所选栏。 我在SWT复合中使用JFreeChart。 任何人都可以确认这是错误的行为还是有解决方法? 下面是完整的sscce ,在您运行它并单击栏后,它将显示小指。 然后重新调整窗口大小并尝试选择栏-它会丢失。