Class JavaFX2为鼠标指针绘图设置通用类
我有一个带有4个不同指针的切换按钮组 当我选择十字线按钮(最右边的一个)时,我有如下步骤 每个按钮调用不同的线指针跟随器:Class JavaFX2为鼠标指针绘图设置通用类,class,draw,abstract,javafx-2,Class,Draw,Abstract,Javafx 2,我有一个带有4个不同指针的切换按钮组 当我选择十字线按钮(最右边的一个)时,我有如下步骤 每个按钮调用不同的线指针跟随器: 最左边的一个按钮:它是一个没有线条的简单指针 二是只显示垂直线指针运动链接 第三只水平线指针移动链接 十字准星 我想创建一个泛型类来设置所选的线,以便在绘图例程中调用它 当选择适当的按钮时,此通用/抽象类“将包含”特定的线指针跟随器代码,这样,绘图例程将仅引用通用类来绘制选择的指针线跟随器 带有十字线的代码是: public class JavaFXApplicatio
public class JavaFXApplicationMove extends Application {
Path path;
BorderPane pane;
Rectangle rect;
Line LH;
Line LV;
XYChart.Series series1 = new XYChart.Series();
SimpleDoubleProperty rectinitX = new SimpleDoubleProperty();
SimpleDoubleProperty rectinitY = new SimpleDoubleProperty();
SimpleDoubleProperty rectX = new SimpleDoubleProperty();
SimpleDoubleProperty rectY = new SimpleDoubleProperty();
@Override
public void start(Stage stage) {
stage.setTitle("Lines plot");
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<String, Number> lineChart = new LineChart<String, Number> (xAxis, yAxis);
final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);
lineChart.setCreateSymbols(false);
lineChart.setAlternativeRowFillVisible(false);
lineChart.setAnimated(true);
series1.setName("Stock1");
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);
path = new Path();
path.setStrokeWidth(5);
path.setStroke(Color.RED);
scene.setOnMouseClicked(mouseHandler);
scene.setOnMouseDragged(mouseHandler);
scene.setOnMouseEntered(mouseHandler);
scene.setOnMouseExited(mouseHandler);
scene.setOnMouseMoved(mouseHandler);
scene.setOnMousePressed(mouseHandler);
scene.setOnMouseReleased(mouseHandler);
rect = new Rectangle();
rect.setFill(Color.web("yellow", 0.3));
rect.setStroke(Color.MAGENTA);
rect.setStrokeDashOffset(50);
rect.widthProperty().bind(rectX.subtract(rectinitX));
rect.heightProperty().bind(rectY.subtract(rectinitY));
pane.getChildren().add(rect);
//LH=new Line();
LH=LineBuilder.create()
.startX(0)
.startY(0)
.endX(10)
.endY(.535)
.strokeWidth(1)
.stroke(Color.BLACK)
.build();
pane.getChildren().add(LH);
LV=LineBuilder.create()
.startX(0)
.startY(0)
.endX(10)
.endY(.535)
.strokeWidth(1)
.stroke(Color.BLACK)
.build();
pane.getChildren().add(LV);
stage.show();
}
EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
rect.setX(mouseEvent.getX());
rect.setY(mouseEvent.getY());
rectinitX.set(mouseEvent.getX());
rectinitY.set(mouseEvent.getY());
LH.setStartX(0);
LH.setStartY(0);
LH.setEndX(0);
LH.setEndY(0);
LV.setStartX(0);
LV.setStartY(0);
LV.setEndX(0);
LV.setEndY(0);
} else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) {
rectX.set(mouseEvent.getX());
rectY.set(mouseEvent.getY());
// Hide the rectangle
rectX.set(0);
rectY.set(0);
} else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED || mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED) {
LineChart<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter();
NumberAxis yAxis = (NumberAxis) lineChart.getYAxis();
NumberAxis xAxis = (NumberAxis) lineChart.getXAxis();
System.out.println("(a) xAxis.getLowerBound() "+xAxis.getLowerBound()+" "+xAxis.getUpperBound());
double Tgap = xAxis.getWidth()/(xAxis.getUpperBound() - xAxis.getLowerBound());
double newXlower=xAxis.getLowerBound(), newXupper=xAxis.getUpperBound();
double newYlower=yAxis.getLowerBound(), newYupper=yAxis.getUpperBound();
double xAxisShift = getSceneShift(xAxis);
double yAxisShift = getSceneShift(yAxis);
double yAxisStep=yAxis.getHeight()/(yAxis.getUpperBound()-yAxis.getLowerBound());
double CurrentPrice=yAxis.getUpperBound()-((mouseEvent.getY()-yAxisShift)/yAxisStep);
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 );
if(rectinitY.get() < mouseEvent.getY()){
newYlower=yAxis.getLowerBound()+Delta/1000;
newYupper=yAxis.getUpperBound()+Delta/1000;
}
else if(rectinitY.get() > mouseEvent.getY()){
newYlower=yAxis.getLowerBound()-Delta/1000;
newYupper=yAxis.getUpperBound()-Delta/1000;
}
yAxis.setLowerBound(newYlower);
yAxis.setUpperBound(newYupper);
}
//System.out.println("(b) xAxis.getLowerBound() "+xAxis.getLowerBound()+" "+xAxis.getUpperBound());
rectinitX.set(mouseEvent.getX());
rectinitY.set(mouseEvent.getY());
if(mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED && mouseEvent.getY()>yAxisShift && mouseEvent.getY()<yAxisShift+yAxis.getHeight() && mouseEvent.getX()>xAxisShift && mouseEvent.getX()<xAxisShift+xAxis.getWidth()){
LH.setStartX(xAxisShift);
LH.setStartY(mouseEvent.getY());
LH.setEndX(xAxisShift+xAxis.getWidth());
LH.setEndY(mouseEvent.getY());
LV.setStartX(mouseEvent.getX());
LV.setStartY(yAxisShift);
LV.setEndX(mouseEvent.getX());
LV.setEndY(yAxisShift+yAxis.getHeight());
double XX=((mouseEvent.getX() - xAxisShift) / Tgap) + xAxis.getLowerBound();
double YY=CurrentPrice;
series1.setName(String.format("%.2g%n",XX) + ", " + String.format("%.4g%n",YY));
int XLB=(int) xAxis.getLowerBound();
int XUB=(int) xAxis.getUpperBound();
}
}
}
};
private static double getSceneShift(Node node) {
double shift = 0;
do {
shift += node.getLayoutX();
node = node.getParent();
} while (node != null);
return shift;
}
private static String getHIstLOstY(XYChart.Series S,int XLowerBound,int XUpperBound) {
double ValLOst=1000000;
double ValHIst=-1000000;
for(int i=XLowerBound; i<XUpperBound; i++){
double P=GetPrice(S,i);
if(ValHIst<P){
ValHIst=P;
}
if(ValLOst>P){
ValLOst=P;
}
}
return Double.toString(ValLOst) + "," + Double.toString(ValHIst);
}
private static double GetPrice(XYChart.Series S,int IX) {
Object SVal=S.getData().get(IX);
//return SVal.toString().toLowerCase();
String Temp=SVal.toString().replaceAll("Data", "");
Temp=Temp.replace("[", "");
Temp=Temp.replace("]", "");
String[] TempArray=Temp.split(",");
return Double.parseDouble(TempArray[1]);
}
public static void main(String[] args) {
launch(args);
}
}
公共类JavaFXApplicationMove扩展应用程序{
路径;
边框窗格;
矩形矩形;
左线;
线路低压;
XYChart.Series系列1=新的XYChart.Series();
SimpleDoubleProperty rectinitX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectiny=新的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);
setTickLabelFormatter(新数字Axis.DefaultFormatter(yAxis){
@凌驾
公共字符串toString(数字对象){
返回String.format(“%7.5f”,对象);
}
});
//最终线形图线形图=新线形图(xAxis,yAxis);
最终线形图线形图=新线形图(xAxis,yAxis);
lineChart.setCreateSynumbles(false);
线形图.setAlternativeRowFillVisible(假);
lineChart.setAnimated(真);
系列1.集合名称(“股票1”);
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);
舞台场景;
路径=新路径();
路径设置行程宽度(5);
路径设定行程(颜色为红色);
场景。setOnMouseClicked(鼠标手柄);
场景。SetonMouseDrawed(鼠标手柄);
场景。setOnMouseEntered(鼠标手柄);
场景:setOnMouseExited(鼠标手柄);
场景:setOnMouseMoved(鼠标手柄);
场景。设置鼠标按下(鼠标手柄);
场景。setOnMouseReleased(鼠标手柄);
rect=新矩形();
矩形设置填充(颜色web(“黄色”,0.3));
直行程(颜色为洋红色);
直接设定行程偏移量(50);
widthProperty()绑定(rectX.subtract(rectinitX));
rect.heightProperty().bind(rectY.subtract(rectinitY));
pane.getChildren().add(rect);
//LH=新行();
LH=LineBuilder.create()
.startX(0)
.斯塔蒂(0)
.endX(10)
.endY(.535)
.冲程宽度(1)
.笔划(颜色.黑色)
.build();
pane.getChildren().add(左侧);
LV=LineBuilder.create()
.startX(0)
.斯塔蒂(0)
.endX(10)
.endY(.535)
.冲程宽度(1)
.笔划(颜色.黑色)
.build();
pane.getChildren().add(LV);
stage.show();
}
EventHandler mouseHandler=新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent MouseEvent){
如果(mouseEvent.getEventType()==mouseEvent.MOUSE_按下){
setX(mouseEvent.getX());
setY(mouseEvent.getY());
rectinitX.set(mouseEvent.getX());
set(mouseEvent.getY());
LH.setStartX(0);
LH.setStartY(0);
LH.setEndX(0);
LH.setEndY(0);
LV.setStartX(0);
LV.setStartY(0);
LV.setEndX(0);
塞滕迪低压(0);
}else如果(mouseEvent.getEventType()==mouseEvent.MOUSE_已释放){
set(mouseEvent.getX());
set(mouseEvent.getY());
//隐藏矩形
rectX.set(0);
矩形集(0);
}如果(mouseEvent.getEventType()==mouseEvent.MOUSE_拖动| | mouseEvent.getEventType()==mouseEvent.MOUSE_移动){
折线图折线图=(折线图)窗格。getCenter();
NumberAxis yAxis=(NumberAxis)lineChart.getYAxis();
NumberAxis xAxis=(NumberAxis)lineChart.getXAxis();
System.out.println(“(a)xAxis.getLowerBound()”+xAxis.getLowerBound()+”+xAxis.getUpperBound());
双Tgap=xAxis.getWidth()/(xAxis.getUpperBound()-xAxis.getLowerBound());
double newXlower=xAxis.getLowerBound(),newXupper=xAxis.getUpperBound();
double newYlower=yAxis.getLowerBond(),newYupper=yAxis.getUpperBound();
双xAxisShift=getSceneShift(xAxis);
双yAxisShift=getSceneShift(yAxis);
double yaxistep=yAxis.getHeight()/(yAxis.getUpperBound()-yAxis.getLowerBound());
double CurrentPrice=yAxis.getUpperBound()-((mouseEvent.getY()-yAxisShift)/yAxisStep);
双三角=0.3;
if(mouseEvent.getEventType()==mouseEvent.MOUSE\u拖动){
如果(rectinitX.get()mouseEvent.getX()){
newXlower=xAxis.getLowerBound()+增量;
newXupper=xAxis.getUpperBound()+Delta;
}
xAxis.setLowerBound(newXlower);
xAxis.setUpperBound(newXupper);
如果(re)
public class SimpleCrosshair {
public void start(double mouseX, double mouseY);
public void update(double sceneShiftX, double sceneShiftY, double mouseX, double mouseY);
public void finish();
}
EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
currentCrosshair.start(mouseEvent.getX(), mouseEvent.getY());
} else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) {
currentCrosshair.finish();
} else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED || mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED) {
LineChart<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter();
NumberAxis yAxis = (NumberAxis) lineChart.getYAxis();
NumberAxis xAxis = (NumberAxis) lineChart.getXAxis();
double xAxisShift = getSceneShift(xAxis);
double yAxisShift = getSceneShift(yAxis);
currentCrosshair.update(xAxisShift, yAxisShift, mouseEvent.getX(), mouseEvent.getY());
}
}
}