在条形图上标记箭头

时间:2013-05-03 13:08:00

标签: java jfreechart

这里我有一个带十字准线的条形图;当我右键单击时,我看到一些菜单,如“LimitBuy @ price”。我想要的是每当我点击右键单击菜单时,我想要一个箭头出现在我点击的坐标上。现在,只要我点击右键,我就能“SOPln”;这意味着我的听众工作正常,但我如何得到一个箭头和下面的文字说“买”。我尝试使用注释,但似乎不起作用。请帮帮我。

image

public class MouseListenerDemo4 extends ApplicationFrame implements
        ChartMouseListener {

    private JFreeChart chart;

    private ChartPanel chartPanel;
    private JLabel priceLabel;
    private double chartX;
    private double chartY;
    public XYPlot plot1;

    public MouseListenerDemo4(String title) {
        super(title);

        priceLabel = new JLabel("");
        priceLabel.setBounds(5000, 5, 50, 20);
        String chartTitle = "Mouse Listener Demo 4";
        String file = "D:\\CL.txt";
        OHLCDataset data2 = createPriceDataset(file);
        System.out.println(data2.getItemCount(0));
        HighLowRenderer renderer1 = new HighLowRenderer();
        renderer1.setTickLength(3);
        renderer1.setBaseToolTipGenerator(new StandardXYToolTipGenerator(
                StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
                new SimpleDateFormat("d-MMM-yyyy"), new DecimalFormat("0.00")));
        renderer1.setSeriesPaint(0, Color.blue);

        DateAxis domainAxis = new DateAxis("Date");
        NumberAxis rangeAxis = new NumberAxis("Price");
        rangeAxis.setNumberFormatOverride(new DecimalFormat("$0.00"));
        rangeAxis.setAutoRange(true);
        rangeAxis.setAutoRangeIncludesZero(false);
        plot1 = new XYPlot(data2, domainAxis, rangeAxis, renderer1);
        plot1.getRangeCrosshairPaint();
        plot1.setBackgroundPaint(Color.white);
        plot1.setDomainGridlinePaint(Color.magenta);
        plot1.setRangeGridlinePaint(Color.magenta);
        plot1.setRangePannable(true);

        plot1.setRangeCrosshairVisible(true);
        plot1.setRangeCrosshairValue(4000, true);
        plot1.setRangeCrosshairLockedOnData(true);
        plot1.setRangeCrosshairVisible(true);

        this.chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot1,
                false);
        chartPanel = new ChartPanel(this.chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(1000, 500));
        chartPanel.setMouseZoomable(true, false);
        chartPanel.addChartMouseListener(this);
        setContentPane(chartPanel);

        priceLabel.setBackground(Color.cyan);
        chartPanel.add(priceLabel);
        priceLabel.setVisible(true);
        priceLabel.setText("");


    }

    private static OHLCDataset createPriceDataset(String filename) {
        // the following data is taken from http://finance.yahoo.com/
        // for demo purposes...

        OHLCSeries s1 = new OHLCSeries(filename);

        try {
            BufferedReader in = new BufferedReader(new FileReader(filename));
            DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
            String inputLine;
            in.readLine();
            while ((inputLine = in.readLine()) != null) {
                StringTokenizer st = new StringTokenizer(inputLine, ",");
                Date date = df.parse(st.nextToken());
                double open = Double.parseDouble(st.nextToken());
                double high = Double.parseDouble(st.nextToken());
                double low = Double.parseDouble(st.nextToken());
                double close = Double.parseDouble(st.nextToken());
                double volume = Double.parseDouble(st.nextToken());

                s1.add(new Day(date), open, high, low, close);
                // t1.add(new Day(date), close);
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        OHLCSeriesCollection dataset = new OHLCSeriesCollection();
        dataset.addSeries(s1);

        return dataset;
    }

    public void chartMouseClicked(ChartMouseEvent event) {
        int mouseX = event.getTrigger().getX();
        int mouseY = event.getTrigger().getY();
        System.out.println("x = " + mouseX + ", y = " + mouseY);
        Point2D p = chartPanel
                .translateScreenToJava2D(new Point(mouseX, mouseY));
        XYPlot plot = (XYPlot) chart.getPlot();
        Rectangle2D plotArea = this.chartPanel.getChartRenderingInfo()
                .getPlotInfo().getDataArea();
        ValueAxis domainAxis = plot.getDomainAxis();
        RectangleEdge domainAxisEdge = plot.getDomainAxisEdge();
        ValueAxis rangeAxis = plot.getRangeAxis();
        RectangleEdge rangeAxisEdge = plot.getRangeAxisEdge();
         chartX = domainAxis.java2DToValue(p.getX(), plotArea,
                domainAxisEdge);
         chartY = rangeAxis.java2DToValue(p.getY(), plotArea,
                rangeAxisEdge);
        this.chartPanel.setHorizontalAxisTrace(true);
        this.chartPanel.setVerticalAxisTrace(true);
        System.out.println("Chart: x = " + chartX + ", y = " + (int) chartY);
        priceLabel.setText("" + (int) chartY);

        JPopupMenu popup = new JPopupMenu();
        JMenuItem limitbuy = new JMenuItem("Limit Buy @ " + (int) chartY);
        limitbuy.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                XYTextAnnotation textannotation = new XYTextAnnotation("Label", (int)chartX, chartY);
                XYShapeAnnotation annotation = new XYShapeAnnotation(
                        new Ellipse2D.Float(1000.0f, 120.0f, 10.0f, 10.0f),
                        new BasicStroke(5.0f), Color.blue);
                XYPointerAnnotation pointer = new XYPointerAnnotation("arrow",
                        0.5, 0.5, 0.0);
                pointer.setPaint(Color.GREEN);
                pointer.setText("mark");
                chart.getXYPlot().addAnnotation(pointer);
                chart.getXYPlot().addAnnotation(annotation);
                chart.getXYPlot().addAnnotation(textannotation);


            }
        });
        popup.add(limitbuy);
        popup.add(new JMenuItem("Limit Sell @ " + (int) chartY));
        popup.add(new JMenuItem("Stop Buy @ " + (int) chartY));
        popup.add(new JMenuItem("Stop Sell @ " + (int) chartY));
        popup.add(new JMenuItem("Market Buy @ " + (int) chartY));
        popup.add(new JMenuItem("Market Sell @ " + (int) chartY));
        chartPanel.setPopupMenu(popup);

    }

    /**
     * Receives chart mouse moved events.
     * 
     * @param event
     *            the event.
     */
    public void chartMouseMoved(ChartMouseEvent event) {
        // ignore
    }

    public static void main(String[] args) {
        MouseListenerDemo4 demo = new MouseListenerDemo4(
                "Mouse Listener Demo 4");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }

}

0 个答案:

没有答案