Grid javafx2.x:如何将线、网格和x记号一起移动?
下面的代码绘制了一个XYLineChart:通过鼠标左键单击并拖动绘制的线可以向左/向右转换Grid javafx2.x:如何将线、网格和x记号一起移动?,grid,javafx-2,linechart,Grid,Javafx 2,Linechart,下面的代码绘制了一个XYLineChart:通过鼠标左键单击并拖动绘制的线可以向左/向右转换 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.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);
}
}
导入javafx.application.application;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.event.EventHandler;
导入javafx.scene.chart.NumberAxis;
导入javafx.scene.chart.XYChart;
导入javafx.stage.stage;
导入javafx.scene.scene;
导入javafx.scene.chart.LineChart;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.BorderPane;
在这里输入代码
公共类GridMove扩展了应用程序{
边框窗格;
XYChart.Series系列1=新的XYChart.Series();
SimpleDoubleProperty rectinitX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectY=新的SimpleDoubleProperty();
@凌驾
公众假期开始(阶段){
最终数字xis xAxis=新数字xis(1,12,1);
最终数值轴=新数值轴(0.53000,0.53910,0.0005);
xAxis.setAnimated(false);
yAxis.setAnimated(false);
yAxis.setTickLabelFormatter(新编号Axis.DefaultFormatter(yAxis){
@凌驾
公共字符串toString(数字对象){
返回String.format(“%7.5f”,对象);
}
});
最终线形图线形图=新线形图(xAxis,yAxis);
lineChart.setCreateSynumbles(false);
线形图.setAlternativeRowFillVisible(假);
线形图。设置动画(假);
线形图。setLegendVisible(假);
series1.getData().add(新的XYChart.Data(1,0.53185));
series1.getData().add(新的XYChart.Data(2,0.532235));
series1.getData().add(新的XYChart.Data(3,0.53234));
series1.getData().add(新的XYChart.Data(4,0.538765));
series1.getData().add(新的XYChart.Data(5,0.53442));
series1.getData().add(新的XYChart.Data(6,0.534658));
series1.getData().add(新的XYChart.Data(7,0.53023));
series1.getData().add(新的XYChart.Data(8,0.53001));
series1.getData().add(新的XYChart.Data(9,0.53589));
series1.getData().add(新的XYChart.Data(10,0.53476));
窗格=新边框窗格();
窗格。设置中心(折线图);
场景=新场景(窗格,800600);
lineChart.getData().addAll(series1);
舞台场景;
场景。setOnMouseClicked(鼠标手柄);
场景。SetonMouseDrawed(鼠标手柄);
场景。setOnMouseEntered(鼠标手柄);
场景:setOnMouseExited(鼠标手柄);
场景:setOnMouseMoved(鼠标手柄);
场景。设置鼠标按下(鼠标手柄);
场景。setOnMouseReleased(鼠标手柄);
stage.show();
}
EventHandler mouseHandler=neweventhandler(){
@凌驾
公共无效句柄(MouseEvent MouseEvent){
if(mouseEvent.getEventType()==mouseEvent.MOUSE_按下){
rectinitX.set(mouseEvent.getX());
}else if(mouseEvent.getEventType()==mouseEvent.MOUSE|u拖动| | mouseEvent.getEventType()==mouseEvent.MOUSE|u移动){
折线图折线图=(折线图)窗格。getCenter();
NumberAxis xAxis=(NumberAxis)lineChart.getXAxis();
双Tgap=xAxis.getWidth()/(xAxis.getUpperBound()-xAxis.getLowerBound());
double newXlower=xAxis.getLowerBound(),newXupper=xAxis.getUpperBound();
双三角=0.3;
if(mouseEvent.getEventType()==mouseEvent.MOUSE\u拖动){
if(rectinitX.get()mouseEvent.getX()){
newXlower=xAxis.getLowerBound()+增量;
newXupper=xAxis.getUpperBound()+Delta;
}
xAxis.setLowerBound(newXlower);
xAxis.setUpperBound(newXupper);
}
rectinitX.set(mouseEvent.getX());
}
}
};
公共静态void main(字符串[]args){
发射(args);
}
}
我的问题是
1) 现在,通过左/右移动线条,栅格和X记号不会移动:那么,如何将线条、栅格和X记号一起平移
2) 在JavaFX2中可以实现这一点吗
谢谢
编辑没有人愿意帮忙吗
编辑2:添加导入语句
编辑3:代码改进,现在网格和线一起移动。只剩下沿直线和栅格移动X轴标记,并且在直线范围值之外缺少垂直栅格线
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);
}
}
import java.util.Set;
导入javafx.application.application;
导入javafx.beans.property.DoubleProperty;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.collections.ObservableList;
导入javafx.event.EventHandler;
导入javafx.scene.chart.Axis;
导入javafx.scene.chart.NumberAxis;
导入javafx.scene.chart.XYChart;
导入javafx.scene.chart.XYChart.Series;
导入javafx.stage.stage;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.chart.LineChart;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.shape.LineTo;
导入javafx.scene.shape.MoveTo;
导入javafx.scene.shape.Path;
公共类GridMove扩展了应用程序{
边框窗格;
XYChart.Series系列1=新的XYChart.Series();
SimpleDoubleProperty rectinitX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectY=新的SimpleDoubleProperty();
线形图;
@凌驾
公众假期开始(阶段){
最终数字xis xAxis=新数字xis(1,12,1);
最终数字轴=新数字轴(0.53000,0.53910,