Ten kod linii narysować na wykresie lewym przyciskiem myszy i przesunąćJavaFX 2.x: Jak edytować linie rysowane na XY LineChart?
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.stage.Stage;
public class Lines extends Application {
Path path;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis(1, 21, 0.1);
yAxis.setTickUnit(1);
yAxis.setPrefWidth(35);
yAxis.setMinorTickCount(10);
yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) {
@Override
public String toString(Number object) {
String label;
label = String.format("%7.2f", object.floatValue());
return label;
}
});
final LineChart<String, Number> lineChart = new LineChart<String, Number>(xAxis, yAxis);
lineChart.setCreateSymbols(false);
lineChart.setAlternativeRowFillVisible(false);
lineChart.setLegendVisible(false);
XYChart.Series series1 = new XYChart.Series();
series1.getData().add(new XYChart.Data("Jan", 1));
series1.getData().add(new XYChart.Data("Feb", 4));
series1.getData().add(new XYChart.Data("Mar", 2.5));
series1.getData().add(new XYChart.Data("Apr", 5));
series1.getData().add(new XYChart.Data("May", 6));
series1.getData().add(new XYChart.Data("Jun", 8));
series1.getData().add(new XYChart.Data("Jul", 12));
series1.getData().add(new XYChart.Data("Aug", 8));
series1.getData().add(new XYChart.Data("Sep", 11));
series1.getData().add(new XYChart.Data("Oct", 13));
series1.getData().add(new XYChart.Data("Nov", 10));
series1.getData().add(new XYChart.Data("Dec", 20));
BorderPane bp = new BorderPane();
bp.setCenter(lineChart);
Scene scene = new Scene(bp, 800, 600);
lineChart.setAnimated(false);
lineChart.getData().addAll(series1);
Lines.MouseHandler mh = new Lines.MouseHandler(bp);
bp.setOnMouseClicked(mh);
bp.setOnMouseMoved(mh);
stage.setScene(scene);
path = new Path();
path.setStrokeWidth(1);
path.setStroke(Color.BLACK);
scene.setOnMouseDragged(mh);
scene.setOnMousePressed(mh);
bp.getChildren().add(path);
stage.setScene(scene);
stage.show();
}
class MouseHandler implements EventHandler<MouseEvent> {
private boolean gotFirst = false;
private Line line;
private Pane pane;
private double x1, y1, x2, y2;
public MouseHandler(Pane pane) {
this.pane = pane;
}
@Override
public void handle(MouseEvent event) {
if(event.getEventType() == MouseEvent.MOUSE_CLICKED) {
if(!gotFirst) {
x1 = x2 = event.getX();
y1 = y2 = event.getY();
line = new Line(x1, y1, x2, y2);
pane.getChildren().add(line);
gotFirst = true;
}
else {
line = null;
gotFirst = false;
}
}
else {
if(line != null) {
x2 = event.getX();
y2 = event.getY();
// update line
line.setEndX(x2);
line.setEndY(y2);
}
}
}
}
}
Moje pytanie brzmi: jak edytować te linie kreślone raz?
Na przykład, gdy jeden lub więcej linii zostanie narysowanych, chciałbym wybrać jedną z nich, a klikając prawym przyciskiem myszy i używając wyskakującego menu, usunąć, zmodyfikować długość, (aby skrócić ją lub dłużej) lub zmień nachylenie linii.
Dzięki wszystkim.
Cześć Bhupendra, dziękuję bardzo! Twój kod jest świetny, naprawdę doceniany. –
jedno ostatnie pytanie, czy możesz mi pomóc z tym problemem? http://stackoverflow.com/questions/12405347/javafx-2-x-still-problems-with-draw-on-chart-zoom Nie jestem w stanie rozwiązać. Jeśli to możliwe, chciałbym się z tobą skontaktować przez e-mail , mój jest [email protected] Dzięki! –