2012-11-05 31 views
8

Câu trả lời được chấp nhận ở đây (JFreechart(Java) - How to draw lines that is partially dashed lines and partially solid lines?) đã giúp tôi bắt đầu con đường thay đổi chuỗi dòng trên biểu đồ của mình. Sau khi bước qua mã của tôi và xem những thay đổi, tôi thấy rằng chuỗi phim của tôi thực tế thay đổi thành "dashedStroke" khi nó được cho là (sau một ngày nhất định "dashedAfter"), nhưng khi biểu đồ được hiển thị toàn bộ dòng . Làm thế nào tôi có thể nhận được một loạt dòng được rút ra vững chắc lúc đầu tiên và tiêu tan sau một ngày được thiết lập?JFreeChart - thay đổi SeriesStroke của các dòng biểu đồ từ dạng rắn thành dấu gạch ngang trong một dòng

/* series line modifications */ 
final Number dashedAfter = timeNowDate.getTime(); 

XYLineAndShapeRenderer render = new XYLineAndShapeRenderer() { 
    Stroke regularStroke = new BasicStroke(); 
    Stroke dashedStroke = new BasicStroke(
          1.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 
          1.0f, new float[] {10.0f, 6.0f}, 0.0f); 
    @Override 
    public Stroke getItemStroke(int row, int column) { 
    Number xVal = cd.getXValue(row, column); 
    if (xVal.doubleValue() > dashedAfter.doubleValue()) { 
     return dashedStroke; 
    } else { 
     return regularStroke; 
    } 
    } 
}; 
render.setBaseShapesVisible(false); 
render.setBaseShapesFilled(true); 
render.setDrawSeriesLineAsPath(true); 
plot.setRenderer(render); 

Trả lời

6

Bạn đã thử triển khai AbstractRenderer#getItemStroke?

enter image description here

Trong ví dụ này tôi đang sử dụng một dòng tiêu tan cho x> 4 cho loạt 2:

XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(){ 
    Stroke soild = new BasicStroke(2.0f); 
    Stroke dashed = new BasicStroke(1.0f,BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float[] {10.0f}, 0.0f); 
    @Override 
    public Stroke getItemStroke(int row, int column) { 
if (row == 2){ 
    double x = dataset.getXValue(row, column); 
    if (x > 4){ 
    return dashed; 
    } else { 
    return soild; 
    } 
} else 
    return super.getItemStroke(row, column); 
    } 
    }; 
    renderer.setBaseShapesVisible(true); 
    renderer.setBaseShapesFilled(true); 
    renderer.setBaseStroke(new BasicStroke(3)); 
    plot.setRenderer(renderer); 

Mặc dù ví dụ này được sử dụng và XYSeries và không ngày bạn shold có thể sửa đổi nó cho bạn cần.

Dưới đây là toàn bộ ví dụ

import java.awt.BasicStroke; 
import java.awt.Stroke; 

import javax.swing.JPanel; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
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.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 

public class LineChartDemo2 extends ApplicationFrame { 

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

    private static JFreeChart createChart(final XYDataset dataset) { 

     JFreeChart chart = ChartFactory.createXYLineChart(
      "Line Chart Demo: XYLineAndShapeRenderer",  
      "X",      
      "Y",      
      dataset,    
      PlotOrientation.VERTICAL, 
      false,      
      false,     
      false    
     ); 

     XYPlot plot = (XYPlot) chart.getPlot(); 
     plot.setDomainPannable(true); 
     plot.setRangePannable(true); 

     XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(){ 
      Stroke soild = new BasicStroke(2.0f); 
      Stroke dashed = new BasicStroke(1.0f,BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float[] {10.0f}, 0.0f); 
      @Override 
      public Stroke getItemStroke(int row, int column) { 
       if (row == 2){ 
        double x = dataset.getXValue(row, column); 
        if (x > 4){ 
         return dashed; 
        } else { 
         return soild; 
        } 
       } else 
        return super.getItemStroke(row, column); 
      } 
     }; 

     renderer.setBaseShapesVisible(true); 
     renderer.setBaseShapesFilled(true); 
     renderer.setBaseStroke(new BasicStroke(3)); 
     plot.setRenderer(renderer); 
     return chart; 
    } 

    public static JPanel createDemoPanel() { 
     JFreeChart chart = createChart(createDataset()); 
     ChartPanel panel = new ChartPanel(chart); 
     panel.setMouseWheelEnabled(true); 
     return panel; 
    } 

    public static void main(String[] args) { 
     LineChartDemo2 demo = new LineChartDemo2(
       "JFreeChart"); 
     demo.pack(); 
     RefineryUtilities.centerFrameOnScreen(demo); 
     demo.setVisible(true); 
    } 

    private static XYDataset createDataset() { 

     XYSeries series1 = new XYSeries("First"); 
     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); 

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

     XYSeries series3 = new XYSeries("Third"); 
     series3.add(3.0, 4.0); 
     series3.add(4.0, 3.0); 
     series3.add(5.0, 2.0); 
     series3.add(6.0, 3.0); 
     series3.add(7.0, 6.0); 
     series3.add(8.0, 3.0); 
     series3.add(9.0, 4.0); 
     series3.add(10.0, 3.0); 

     XYSeriesCollection dataset = new XYSeriesCollection(); 
     dataset.addSeries(series1); 
     dataset.addSeries(series2); 
     dataset.addSeries(series3); 

     return dataset; 

    } 


} 
+0

+1 để theo dõi [lời khuyên API] (http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/renderer/AbstractRenderer.html#getItemStroke%28int,%20int%29) – trashgod

+0

Đây là nhiều hơn dọc theo dòng của ví dụ tôi liên kết đến, và gần gũi hơn với nơi tôi bắt đầu cố gắng toàn bộ điều này. Tôi đã hy vọng một số gợi ý này sẽ giúp ích cho bạn, nhưng tôi vẫn còn có cùng một vấn đề với đường dây không thay đổi từ rắn sang đứt quãng, nhưng là một hay khác. Tôi đã đăng lại mã của mình để phản ánh những thay đổi. Bất kỳ trợ giúp thêm được đánh giá cao! –

+1

@MisterMichaelK nếu bạn có thể cùng nhau một ví dụ tự chứa (SSCCE) Tôi sẽ thử mã cho bạn. Thật khó để thấy những gì đang xảy ra mà không có dữ liệu – GrahamA

0

Tôi nghĩ rằng bạn làm điều đó đúng và nếu nó không hoạt động có thể là không thể? Im chỉ đoán ở đây nhưng bạn có thể vẽ 2 dòng thay vì 1. Dòng thứ hai của bạn sẽ bắt đầu nơi dòng đầu tiên của bạn kết thúc. Điều đó có thể lộn xộn nếu bạn muốn thay đổi đột quỵ và khi bạn muốn thay đổi nó mỗi lần lặp của vòng lặp tùy thuộc vào điều kiện, mã của bạn có thể sẽ trở nên phức tạp hơn. Hoặc chỉ vẽ một dòng mới cho mỗi.

1

tôi vẫn đang gặp vấn đề tương tự của dòng không thay đổi từ rắn để tiêu tan, nhưng là cái này hay cái khác.

Phương pháp setDrawSeriesLineAsPath() "kiểm soát xem mỗi chuỗi có được vẽ dưới dạng một đường dẫn hay không." Điều này ngăn cản việc thay đổi Stroke động, vì getItemStroke() sẽ chỉ được gọi một lần cho mỗi chuỗi.

Phụ lục: Một cách dễ dàng để xác minh điều này là gọi setDrawSeriesLineAsPath() trong ví dụ của @ GrahamA và ngắt trong drawFirstPassShape() trong trình gỡ lỗi.

+0

Đây cũng là một thành phần quan trọng đối với những gì tôi đang cố gắng hoàn thành. Hiện tại, thiết lập setDrawSeriesLineAsPath() thành false làm cho biểu đồ của tôi hoạt động chính xác trong đó dòng thay đổi từ cứng thành dấu gạch ngang khi tôi muốn. Thật không may, các dấu gạch ngang là chủ yếu là rắn ngoại trừ khi đồ thị của tôi tăng lên đáng kể. Tôi biết điều này liên quan đến phương thức sDSLAP(), tôi có rất nhiều điểm dữ liệu và đơn giản là không đủ không gian giữa mỗi điểm để gạch ngang các đường trừ khi có sự gia tăng lớn giữa các điểm. Có cách nào để thiết lập điều kiện này cũng như getItemStroke() không? –

+1

NAFAIK, mặc dù tôi thích 'ChartPanel # setMouseWheelEnabled (true)' để dễ dàng phóng to. Tôi cho rằng bạn có thể cho phép người dùng chuyển đổi chế độ xem như mong muốn, cho [example] (http://stackoverflow.com/a/5522583/230513). – trashgod

+1

@MisterMichaelK nếu các điểm gần nhau tại sao không thay đổi màu sắc thay vì sau đó là kiểu dáng, ví dụ [ở đây] (http://stackoverflow.com/questions/11962836/jfreechart-different-colors-in-different-regions-for- cùng-dataseries/11965997 # 11965997). – GrahamA