2012-10-29 5 views
6

नीचे दिया गया कोड XYLineChart प्लॉट करता है: बाएं माउस क्लिक करके प्लॉट लाइन को ड्रैग/दाएं अनुवादित किया जा सकता है।जावाएफएक्स 2.x: लाइन, ग्रिड और एक्स टिक्स को एक साथ कैसे स्थानांतरित करें?

import javafx.application.Application; 
import javafx.beans.property.SimpleDoubleProperty; 
import javafx.event.EventHandler; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.chart.LineChart; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
enter code here 


public class GridMove extends Application { 

    BorderPane pane; 
    XYChart.Series series1 = new XYChart.Series(); 
    SimpleDoubleProperty rectinitX = new SimpleDoubleProperty(); 
    SimpleDoubleProperty rectX = new SimpleDoubleProperty(); 
    SimpleDoubleProperty rectY = new SimpleDoubleProperty(); 

    @Override 
    public void start(Stage stage) { 

     final NumberAxis xAxis = new NumberAxis(1, 12, 1); 
     final NumberAxis yAxis = new NumberAxis(0.53000, 0.53910, 0.0005); 

     xAxis.setAnimated(false); 
     yAxis.setAnimated(false); 

     yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) { 
      @Override 
      public String toString(Number object) { 
       return String.format("%7.5f", object); 
      } 
     }); 

     final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis); 

     lineChart.setCreateSymbols(false); 
     lineChart.setAlternativeRowFillVisible(false); 
     lineChart.setAnimated(false); 
     lineChart.setLegendVisible(false); 

     series1.getData().add(new XYChart.Data(1, 0.53185)); 
     series1.getData().add(new XYChart.Data(2, 0.532235)); 
     series1.getData().add(new XYChart.Data(3, 0.53234)); 
     series1.getData().add(new XYChart.Data(4, 0.538765)); 
     series1.getData().add(new XYChart.Data(5, 0.53442)); 
     series1.getData().add(new XYChart.Data(6, 0.534658)); 
     series1.getData().add(new XYChart.Data(7, 0.53023)); 
     series1.getData().add(new XYChart.Data(8, 0.53001)); 
     series1.getData().add(new XYChart.Data(9, 0.53589)); 
     series1.getData().add(new XYChart.Data(10, 0.53476)); 

     pane = new BorderPane(); 
     pane.setCenter(lineChart); 
     Scene scene = new Scene(pane, 800, 600); 
     lineChart.getData().addAll(series1); 

     stage.setScene(scene); 

     scene.setOnMouseClicked(mouseHandler); 
     scene.setOnMouseDragged(mouseHandler); 
     scene.setOnMouseEntered(mouseHandler); 
     scene.setOnMouseExited(mouseHandler); 
     scene.setOnMouseMoved(mouseHandler); 
     scene.setOnMousePressed(mouseHandler); 
     scene.setOnMouseReleased(mouseHandler); 
     stage.show(); 
    } 
    EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent mouseEvent) { 

      if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) { 
       rectinitX.set(mouseEvent.getX()); 
      } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED || mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED) { 
       LineChart<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter(); 
       NumberAxis xAxis = (NumberAxis) lineChart.getXAxis(); 

       double Tgap = xAxis.getWidth()/(xAxis.getUpperBound() - xAxis.getLowerBound()); 
       double newXlower = xAxis.getLowerBound(), newXupper = xAxis.getUpperBound(); 
       double Delta = 0.3; 

       if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
        if (rectinitX.get() < mouseEvent.getX()) { 
         newXlower = xAxis.getLowerBound() - Delta; 
         newXupper = xAxis.getUpperBound() - Delta; 
        } else if (rectinitX.get() > mouseEvent.getX()) { 
         newXlower = xAxis.getLowerBound() + Delta; 
         newXupper = xAxis.getUpperBound() + Delta; 
        } 
        xAxis.setLowerBound(newXlower); 
        xAxis.setUpperBound(newXupper); 
       } 
       rectinitX.set(mouseEvent.getX()); 
      } 
     } 
    }; 

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

मेरे सवालों का छोड़ दिया लाइन ले जाकर

1) अब कर रहे हैं/सही, ग्रिड और एक्स Ticks के लिए कदम नहीं करता है: हां, तो कैसे रेखा, ग्रिड और एक्स Ticks एक साथ अनुवाद करने के लिए?

2) क्या यह जावाएफएक्स 2 में इसे पूरा करना संभव है?

धन्यवाद

संपादित कोई भी मदद करने को तैयार?

संपादित करें 2: आयात बयान जोड़ा

संपादित करें 3: कोड सुधार, अब ग्रिड और रेखा एक साथ ले जाता है। यह केवल स्थानांतरित करने के लिए एक्स अक्ष रेखा और ग्रिड के साथ टिक्स बनी हुई है, और ऊर्ध्वाधर ग्रिड लाइन के बाहर लाइन रेंज को महत्व देता

import java.util.Set; 
import javafx.application.Application; 
import javafx.beans.property.DoubleProperty; 
import javafx.beans.property.SimpleDoubleProperty; 
import javafx.collections.ObservableList; 
import javafx.event.EventHandler; 
import javafx.scene.chart.Axis; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.scene.chart.XYChart.Series; 
import javafx.stage.Stage; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.chart.LineChart; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.shape.LineTo; 
import javafx.scene.shape.MoveTo; 
import javafx.scene.shape.Path; 

public class GridMove extends Application { 

BorderPane pane; 

XYChart.Series series1 = new XYChart.Series(); 

SimpleDoubleProperty rectinitX = new SimpleDoubleProperty(); 
SimpleDoubleProperty rectX = new SimpleDoubleProperty(); 
SimpleDoubleProperty rectY = new SimpleDoubleProperty(); 
LineChart<Number, Number> lineChart; 

@Override 
public void start(Stage stage) { 

    final NumberAxis xAxis = new NumberAxis(1, 12, 1); 
    final NumberAxis yAxis = new NumberAxis(0.53000, 0.53910, 0.0005); 

    xAxis.setAnimated(false); 
    yAxis.setAnimated(false); 

    yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) { 
     @Override 
     public String toString(Number object) { 
      return String.format("%7.5f", object); 
     } 
    }); 

    lineChart = new LineChart<Number, Number>(xAxis, yAxis); 

    lineChart.setCreateSymbols(false); 
    lineChart.setAlternativeRowFillVisible(false); 
    lineChart.setAnimated(false); 
    lineChart.setLegendVisible(false); 

    series1.getData().add(new XYChart.Data(1, 0.53185)); 
    series1.getData().add(new XYChart.Data(2, 0.532235)); 
    series1.getData().add(new XYChart.Data(3, 0.53234)); 
    series1.getData().add(new XYChart.Data(4, 0.538765)); 
    series1.getData().add(new XYChart.Data(5, 0.53442)); 
    series1.getData().add(new XYChart.Data(6, 0.534658)); 
    series1.getData().add(new XYChart.Data(7, 0.53023)); 
    series1.getData().add(new XYChart.Data(8, 0.53001)); 
    series1.getData().add(new XYChart.Data(9, 0.53589)); 
    series1.getData().add(new XYChart.Data(10, 0.53476)); 

    pane = new BorderPane(); 
    pane.setCenter(lineChart); 
    Scene scene = new Scene(pane, 800, 600); 
    lineChart.getData().addAll(series1);    

    stage.setScene(scene); 

    scene.setOnMouseClicked(mouseHandler); 
    scene.setOnMouseDragged(mouseHandler); 
    scene.setOnMouseEntered(mouseHandler); 
    scene.setOnMouseExited(mouseHandler); 
    scene.setOnMouseMoved(mouseHandler); 
    scene.setOnMousePressed(mouseHandler); 
    scene.setOnMouseReleased(mouseHandler); 
    stage.show();  
} 
EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent mouseEvent) { 

      if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) { 
      rectinitX.set(mouseEvent.getX()); 
     } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED || mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED) { 
      LineChart<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter(); 
      NumberAxis xAxis = (NumberAxis) lineChart.getXAxis(); 

      double newXlower = xAxis.getLowerBound(), newXupper = xAxis.getUpperBound(); 
      double Delta = 0.3; 

      if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
       if (rectinitX.get() < mouseEvent.getX()) { 
        Delta *= -1;      
       } 
       newXlower = xAxis.getLowerBound() + Delta; 
       newXupper = xAxis.getUpperBound() + Delta; 

       xAxis.setLowerBound(newXlower); 
       xAxis.setUpperBound(newXupper); 

       DoubleProperty p1 = xAxis.scaleXProperty(); 
       DoubleProperty p2 = xAxis.translateXProperty(); 

       double horizontalValueRange = xAxis.getUpperBound() - xAxis.getLowerBound(); 
       double horizontalWidthPixels = xAxis.getWidth(); 
       //pixels per unit 
       double xScale = horizontalWidthPixels/horizontalValueRange; 

       Set<Node> nodes = lineChart.lookupAll(".chart-vertical-grid-lines"); 
       for (Node n: nodes) { 
        Path p = (Path) n; 
        double currLayoutX = p.getLayoutX(); 
        p.setLayoutX(currLayoutX + (Delta*-1) * xScale); 
       }      
       double lox = xAxis.getLayoutX();          
      } 
      rectinitX.set(mouseEvent.getX()); 
     } 
    } 
}; 
public static void main(String[] args) { 
    launch(args); 
} 
} 

किसी भी मदद की बहुत सराहना की याद कर रहे हैं!

+0

आप विशेष रूप से क्या करने की कोशिश कर रहे हैं? जब मैं इसे संकलित करता हूं (वैसे, कृपया अगली बार आयात शामिल करें, ग्रहण/नेटबीन्स स्मार्ट हैं, लेकिन स्मार्ट नहीं है) और इसे चलाने के लिए मैं प्लॉट अंक के साथ * टिक * टिक टिक के साथ ग्राफ को देखता हूं। यह समझ में आता है। क्या आप ग्राफ का अनुवाद करना चाहते हैं (सभी बिंदु मानों को बदलें) या आप ग्राफ को स्थानांतरित करना चाहते हैं। आप निश्चित रूप से इसे आगे बढ़ रहे हैं। –

+0

हाय डैनियल: यह कोड टिक मानों को बदलता है जबकि ग्रिड और टिक अंक अभी भी खड़े हैं। क्या अधिक है, चूंकि एक्स अक्ष 1 से 10 तक int मानों में है, इसलिए मुझे लाइन चार्ट –

+0

बाएं/दाएं स्थानांतरित करते समय दशमलव नहीं होना चाहिए: जब मैं इसे चलाता हूं, तो टिक स्थिर रहती हैं, लेकिन प्रतिबिंबित करने के लिए संख्या बदलती हैं आप क्या देख रहे हैं (सही व्यवहार)। दो, यदि आप टिकों के मूल्य के बारे में चिंतित हैं तो आपको इसे पूरे मूल्य के माध्यम से सेट करने की आवश्यकता है। अभी आप माउस इवेंट (डबल) का उपयोग कर रहे हैं जो इसे डबल पर सेट कर रहा है। आपको (1) के सेट से इसे "स्नैप" करने के लिए कुछ गणना करने की आवश्यकता होगी लेकिन यह बहुत कठिन नहीं होना चाहिए। यदि आप चार्ट के साथ चार्ट स्क्रॉल करने में रुचि रखते हैं तो आपको गहरी लगने की आवश्यकता होगी, जो "शेल्फ से बाहर" समाधान प्रतीत नहीं होता है। –

उत्तर

0

यह एक टिप्पणी है लेकिन किसी भी तरह टिप्पणी करने के लिए बहुत नया है।

मैं आपके चार्ट को अदृश्य स्क्रॉलबार के साथ स्क्रॉलपैन में एम्बेड करके और चार्ट की वाई-अक्ष अस्पष्टता को 0 पर सेट करके भी संपर्क करूंगा। यदि सभी चार्ट डेटा को स्मृति में लोड करने के लिए व्यवहार्य नहीं है, तो आपको स्क्रॉल इवेंट आदि में डेटा लाने का प्रबंधन करना होगा।

इसके अतिरिक्त आप अपने वाई-अक्ष के लिए स्टैंडअलोन नंबरएक्सिस का उपयोग कर सकते हैं। आपको हाथ से प्रोपर स्केलिंग और पोजिशनिंग करना है।

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