亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JFreeChart MouseListener無法解析圖表元素

JFreeChart MouseListener無法解析圖表元素

PIPIONE 2019-11-04 13:16:12
我有堆疊的條形圖,我希望能夠在其中選擇單個條形。但是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的。任何人都可以確認這是錯誤的行為還是有解決方法?
查看完整描述

3 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

好的,我發現了問題。在SWT中,有多個構造函數可以創建ChartComposite,大多數使用默認值來指定最小/最大寬度和高度。就我而言,只要將圖表放大到DEFAULT_MAXIMUM_DRAW_WIDTH(800px)以上,坐標就會變得混亂。因此,解決方案是使用完整的構造函數并為您的顯示指定相關邊界。這很難破解...主要是由于缺乏適當的文檔。


查看完整回答
反對 回復 2019-11-04
?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

從Swing運行時,示例性渲染器具有正確的幾何形狀,如下所示。我不確定SWT為何會出現問題,但是此結果可能會縮小搜索范圍。

import java.awt.Color;

import java.awt.EventQueue;

import java.awt.Paint;

import java.util.Random;

import javax.swing.JFrame;

import org.jfree.chart.ChartMouseEvent;

import org.jfree.chart.ChartMouseListener;

import org.jfree.chart.ChartPanel;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.axis.DateAxis;

import org.jfree.chart.axis.DateTickMarkPosition;

import org.jfree.chart.axis.NumberAxis;

import org.jfree.chart.entity.ChartEntity;

import org.jfree.chart.entity.XYItemEntity;

import org.jfree.chart.event.RendererChangeEvent;

import org.jfree.chart.plot.XYPlot;

import org.jfree.chart.renderer.xy.StackedXYBarRenderer;

import org.jfree.chart.renderer.xy.StandardXYBarPainter;

import org.jfree.data.time.Day;

import org.jfree.data.time.Hour;

import org.jfree.data.time.TimeTableXYDataset;

import org.jfree.data.xy.TableXYDataset;


public class StackedChartSwing {


    private ChartPanel panel;

    private StackedRenderer renderer;

    private Color[] colors = new Color[]{

        new Color(230, 240, 255),

        new Color(240, 255, 240),

        new Color(255, 255, 255),

        new Color(255, 255, 240),

        new Color(255, 240, 240),

        new Color(240, 240, 240)

    };


    public StackedChartSwing() {

        JFreeChart chart = createStackedChart(createStackedDataset());

        panel = new ChartPanel(chart);

        panel.addChartMouseListener(new ThisMouseListener());

    }


    private JFreeChart createStackedChart(TableXYDataset tablexydataset) {

        DateAxis dateaxis = new DateAxis();

        dateaxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);

        NumberAxis numberaxis = new NumberAxis("Event counts");

        renderer = new StackedRenderer();

        XYPlot plot = new XYPlot(tablexydataset, dateaxis, numberaxis, renderer);

        plot.setBackgroundPaint(Color.white);

        plot.setDomainGridlinePaint(Color.lightGray);

        plot.setDomainGridlinesVisible(true);

        plot.setRangeGridlinesVisible(true);

        plot.setRangeGridlinePaint(Color.lightGray);


        JFreeChart chart = new JFreeChart(null, plot);

        chart.setBackgroundPaint(Color.white);

        chart.setBorderVisible(false);

        chart.setBorderPaint(null);


        return chart;

    }


    class StackedRenderer extends StackedXYBarRenderer {


        int selectedRow = -1, selectedCol = -1;


        public StackedRenderer() {

            setDrawBarOutline(true);

            setBarPainter(new StandardXYBarPainter());

            setShadowVisible(false);

            setSeriesPaint(0, Color.blue);

            setMargin(0.2);

        }


        public void select(int row, int col) {

            selectedRow = row;

            selectedCol = col;

            notifyListeners(new RendererChangeEvent(this));

        }


        @Override

        public Paint getItemPaint(final int row, final int col) {

            if (row == selectedRow && col == selectedCol) {

                return Color.pink;

            }

            return colors[row];

        }

    }


    class ThisMouseListener implements ChartMouseListener {


        @Override

        public void chartMouseMoved(ChartMouseEvent event) {

        }


        @Override

        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);

        }

    }


    private TableXYDataset createStackedDataset() {

        Random random = new Random(0);

        TimeTableXYDataset ds = new TimeTableXYDataset();

        Day day = new Day();

        for (int i = 0; i < 24; i++) {

            Hour hour = new Hour(i, day);

            ds.add(hour, random.nextInt(20), "A");

            ds.add(hour, random.nextInt(20), "B");

            ds.add(hour, random.nextInt(20), "C");

            ds.add(hour, random.nextInt(20), "D");

            ds.add(hour, random.nextInt(20), "E");

            ds.add(hour, random.nextInt(20), "F");

        }


        return ds;

    }


    private void display() {

        JFrame f = new JFrame("Test");

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.add(panel);

        f.pack();

        f.setLocationRelativeTo(null);

        f.setVisible(true);

    }


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {


            @Override

            public void run() {

                new StackedChartSwing().display();

            }

        });

    }

}


查看完整回答
反對 回復 2019-11-04
?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

擺動不是這里的問題。問題在JFreeChart的SWT版本中。實際上,最初打開時,一切正常。但是,一旦您調整了主機框架的大小,事情就會變得瘋狂。它必須非常簡單,就好像圖表不知道已調整大小一樣。但是它確實可以正確繪制,只是渲染器變得無用。我需要這些東西才能在Eclipse RCP應用程序中工作,如果無法解決,所有庫都將變為無效是多么可惜的事情。

查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 801 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號