可滚动的JFree域轴和自定义标记标签

时间:2017-05-22 00:29:42

标签: java swing jfreechart

我有这个代码来绘制图形,这很好用。我在这里需要两件事

  1. 在域轴(x)上我希望能够滚动。
  2. 在标记上,我看到粗粗线。我希望能够看到这个标记的一些可读文本。
  3. 现在我看到了这个输出 enter image description here

    在缩放时我看到了这个

    enter image description here

    1. 同样在域轴上,我有毫秒值。我可以将它映射到人类可读的日期吗?

      public class Grapher extends ApplicationFrame {
      
          public Grapher(final String title, List<PriceModel> priceModels) {
      
              super(title);
              final XYSeries series = new XYSeries("foo");
              double max = Double.MIN_VALUE, min = Double.MAX_VALUE;
              for (int i = 0; i < priceModels.size(); i++) {
                  double price = priceModels.get(i).getPrice();
                  if (price < min) {
                      min = price;
                  }
                  if (price > max) {
                      max = price;
                  }
                  series.add((double) priceModels.get(i).getDate(), price);
              }
      
              final XYSeriesCollection data = new XYSeriesCollection(series);
              final JFreeChart chart = ChartFactory.createXYLineChart(
                      "XY Series Demo",
                      "X",
                      "Y",
                      data,
                      PlotOrientation.VERTICAL,
                      true,
                      true,
                      false
              );
      
              for (int i = 0; i < priceModels.size(); i++) {
                  if (priceModels.get(i).getAction() != null) {
                      Marker marker = new ValueMarker((double) priceModels.get(i).getDate());
                      marker.setLabelAnchor(RectangleAnchor.BOTTOM_RIGHT);
                      marker.setLabelTextAnchor(TextAnchor.TOP_RIGHT);
      
                      if (priceModels.get(i).getAction() == Types.Action.SELL) {
                          marker.setPaint(Color.green);
                          marker.setLabel("SELL");
                      } else {
                          marker.setPaint(Color.red);
                          marker.setLabel("BUY");
                      }
                      marker.setStroke(new BasicStroke(10.0f));
                      chart.getXYPlot().addDomainMarker(marker);
                  }
              }
              chart.getXYPlot().setBackgroundPaint(Color.white);
              chart.getXYPlot().getRenderer().setPaint(Color.BLUE);
              chart.getXYPlot().getRangeAxis().setRange(min - 1, max + 1);
              final ChartPanel chartPanel = new ChartPanel(chart);
              chartPanel.setBackground(Color.WHITE);
              chartPanel.setRangeZoomable(true);
              chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
              setContentPane(chartPanel);
          }
      
          public static void draw(List<PriceModel> priceModels) {
              final Grapher demo = new Grapher("foo", priceModels);
              demo.pack();
              RefineryUtilities.centerFrameOnScreen(demo);
              demo.setVisible(true);
          }
      }
      

1 个答案:

答案 0 :(得分:3)

您必须结合以下几种方法:

  1. 域名滚动替代方案

  2. 标记文字:对example使用XYTextAnnotation

  3. 格式化日期:使用DateAxis替换工厂的轴,并使用setDateFormatOverride()替换example