2013-03-25 11 views
7

मैं JavaFX का उपयोग कर एक श्रृंखला चार्ट बनाने की कोशिश कर रहा हूं, जहां डेटा गतिशील रूप से डाला जाता है।जावाएफएक्स चार्ट में मूल्य मार्कर कैसे जोड़ें?

प्रत्येक बार जब कोई नया मान डाला जाता है, तो मैं यह जांचना चाहूंगा कि यह अब तक का उच्चतम मूल्य है या नहीं, और यदि ऐसा है, तो यह दिखाने के लिए कि यह अधिकतम मूल्य है, मैं क्षैतिज रेखा खींचना चाहता हूं।

जेएफरी चार्ट में मैंने वैल्यूमार्कर का उपयोग किया होगा, लेकिन मैं जावाएफएक्स के साथ ऐसा करने की कोशिश कर रहा हूं।

मैंने लाइन ऑब्जेक्ट का उपयोग करने का प्रयास किया, लेकिन यह निश्चित रूप से वही नहीं है, क्योंकि मैं चार्ट मान प्रदान नहीं कर सकता, यह विंडोज़ में सापेक्ष पिक्सेल स्थिति लेता है।

http://postimg.org/image/s5fkupsuz/

कोई सुझाव:

यहाँ चार्ट के स्क्रीनशॉट मैं हासिल करना चाहते हैं? धन्यवाद।

उत्तर

14

चार्ट मानों को पिक्सल में कनवर्ट करने के लिए आप विधि NumberAxis#getDisplayPosition() का उपयोग कर सकते हैं जो चार्ट नोड्स के वास्तविक निर्देशांक लौटाता है।

हालांकि इन निर्देशांक क्षेत्र है, जो आप अगले कोड से पता कर सकते हैं चार्ट के सापेक्ष हैं:

Node chartArea = chart.lookup(".chart-plot-background"); 
Bounds chartAreaBounds = chartArea.localToScene(chartArea.getBoundsInLocal()); 

नोट localToScene() विधि आप दृश्य लोगों के लिए किसी भी निर्देशांक कन्वर्ट करने के लिए अनुमति देता है। इस प्रकार आप अपने मूल्य मार्कर निर्देशांक को अपडेट करने के लिए उनका उपयोग कर सकते हैं। सुनिश्चित करें कि आप अपनी दृश्य दिखाए जाने के बाद localToScene कॉल करें। जिसके नीचे

देखें नमूना कार्यक्रम अगले चार्ट का उत्पादन: // stackoverflow:

enter image description here

public class LineChartValueMarker extends Application { 

    private Line valueMarker = new Line(); 
    private XYChart.Series<Number, Number> series = new XYChart.Series<>(); 
    private NumberAxis yAxis; 
    private double yShift; 

    private void updateMarker() { 
     // find maximal y value 
     double max = 0; 
     for (Data<Number, Number> value : series.getData()) { 
      double y = value.getYValue().doubleValue(); 
      if (y > max) { 
       max = y; 
      } 
     } 
     // find pixel position of that value 
     double displayPosition = yAxis.getDisplayPosition(max); 
     // update marker 
     valueMarker.setStartY(yShift + displayPosition); 
     valueMarker.setEndY(yShift + displayPosition); 
    } 

    @Override 
    public void start(Stage stage) { 
     LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(0, 100, 10), yAxis = new NumberAxis(0, 100, 10)); 

     series.getData().add(new XYChart.Data(0, 0)); 
     series.getData().add(new XYChart.Data(10, 20)); 

     chart.getData().addAll(series); 
     Pane pane = new Pane(); 
     pane.getChildren().addAll(chart, valueMarker); 
     Scene scene = new Scene(pane); 

     // add new value on mouseclick for testing 
     chart.setOnMouseClicked(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent t) { 
       series.getData().add(new XYChart.Data(series.getData().size() * 10, 30 + 50 * new Random().nextDouble())); 
       updateMarker(); 
      } 
     }); 

     stage.setScene(scene); 
     stage.show(); 

     // find chart area Node 
     Node chartArea = chart.lookup(".chart-plot-background"); 
     Bounds chartAreaBounds = chartArea.localToScene(chartArea.getBoundsInLocal()); 
     // remember scene position of chart area 
     yShift = chartAreaBounds.getMinY(); 
     // set x parameters of the valueMarker to chart area bounds 
     valueMarker.setStartX(chartAreaBounds.getMinX()); 
     valueMarker.setEndX(chartAreaBounds.getMaxX()); 
     updateMarker(); 
    } 

    public static void main(String[] args) { 
     launch(); 
    } 
} 
+0

+1 अच्छा dirtyness – kleopatra

+0

:-) Btw, अपने कोड पुनः आकार देने योग्य माता-पिता http से निपटने के लिए एक सा बदल दिया है। कॉम/ए/24403761/203657 – kleopatra

+0

@ क्लोपेट्रा, धन्यवाद! लेकिन क्यों गंदे? :) –

संबंधित मुद्दे