2012-04-27 5 views
2

JavaFX 2.0에서 XYChart에 자유 그리기 코드가 있습니다. 크기 조정 차트를 만들 때 문제가 있습니다. 프리 핸드 드로잉의 문제를 번역했습니다자유형 그리기로 Javafx 2 차트 크기 조정

크기를 조정할 때 처음에는 크기가 조절되지 않지만 약간의 "차트 이동"이후에는 수정 된 드로가 그 자체로 수정됩니다.

어떻게 향상시킬 수 있습니까?

내 코드입니다 : 당신 좌표가 잘못 앵커를 기반으로 보인다

package testjavafxapplication; 

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.ObservableList; 
import javafx.event.EventHandler; 
import javafx.geometry.Bounds; 
import javafx.scene.chart.CategoryAxis; 
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; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.LineTo; 
import javafx.scene.shape.MoveTo; 
import javafx.scene.shape.Path; 
import javafx.scene.transform.Scale; 
import javafx.scene.transform.Transform; 
import javafx.scene.transform.Translate; 

public class FreehandResize extends Application { 

private CategoryAxis xAxis = new CategoryAxis(); 
private NumberAxis yAxis = new NumberAxis(0.53000, 0.53910, 0.0001); 
private LineChart<String, Number> lineChart = new LineChart<String, Number>  (xAxis, yAxis); 
private Path path; 
private double initialWidth; 
private double initialheight; 
private Translate translate = new Translate(0, 0); 
private Scale scale = new Scale(1, 1); 
private ChangeListener<Number> changeListener = new ChangeListener<Number>() { 

    @Override 
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { 
    Bounds y_axisBounds = yAxis.getBoundsInLocal(); 
    double xOffset = y_axisBounds.getMaxX(); 

    translate.setX(xOffset); 

    Bounds chartBounds = lineChart.getBoundsInLocal(); 
    scale.setX((chartBounds.getWidth() - xOffset)/initialWidth); 
    scale.setY((chartBounds.getHeight() - xAxis.getBoundsInLocal().getHeight())/initialheight); 
    } 
    }; 
private EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 

@Override 
public void handle(MouseEvent mouseEvent) { 

    double targetX = (mouseEvent.getX() - translate.getX())/scale.getX(); 
    double targetY = mouseEvent.getY()/scale.getY(); 

    if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) { 
    path.getElements().add(new MoveTo(targetX, targetY)); 
    } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
    path.getElements().add(new LineTo(targetX, targetY)); 
    } 
} 

}; 

    @Override 
    public void start(Stage stage) { 
    stage.setTitle("Resize line plot"); 

    yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) { 

    @Override 
    public String toString(Number object) { 
    return String.format("%6.4f", object); 
    } 
}); 

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

XYChart.Series series1 = new XYChart.Series(); 
series1.getData().add(new XYChart.Data("Jan", 0.53185)); 
series1.getData().add(new XYChart.Data("Feb", 0.532235)); 
series1.getData().add(new XYChart.Data("Mar", 0.53234)); 
series1.getData().add(new XYChart.Data("Apr", 0.538765)); 
series1.getData().add(new XYChart.Data("May", 0.53442)); 
series1.getData().add(new XYChart.Data("Jun", 0.534658)); 
series1.getData().add(new XYChart.Data("Jul", 0.53023)); 
series1.getData().add(new XYChart.Data("Aug", 0.53001)); 
series1.getData().add(new XYChart.Data("Sep", 0.53589)); 
series1.getData().add(new XYChart.Data("Oct", 0.53476)); 
series1.getData().add(new XYChart.Data("Nov", 0.530123)); 
series1.getData().add(new XYChart.Data("Dec", 0.53035)); 
lineChart.getData().addAll(series1); 

BorderPane pane = new BorderPane(); 
pane.setCenter(lineChart); 

Scene scene = new Scene(pane, 800, 600); 
stage.setScene(scene); 

path = new Path(); 
path.setStrokeWidth(2); 
path.setStroke(Color.CHOCOLATE); 

ObservableList<Transform> transforms = path.getTransforms(); 
transforms.add(0, translate); 
transforms.add(1, scale); 

scene.setOnMouseClicked(mouseHandler); 
scene.setOnMouseDragged(mouseHandler); 
scene.setOnMouseEntered(mouseHandler); 
scene.setOnMouseExited(mouseHandler); 
scene.setOnMouseMoved(mouseHandler); 
scene.setOnMousePressed(mouseHandler); 
scene.setOnMouseReleased(mouseHandler); 

pane.getChildren().add(path); 

scene.widthProperty().addListener(changeListener); 
scene.heightProperty().addListener(changeListener); 

stage.show(); 
Bounds axisBounds = yAxis.getBoundsInLocal(); 
double xOffset = axisBounds.getMaxX(); 
translate.setX(xOffset); 

Bounds chartBounds = lineChart.getBoundsInLocal(); 
initialWidth = chartBounds.getWidth() - xOffset; 
initialheight = chartBounds.getHeight() - xAxis.getBoundsInLocal().getHeight(); 
} 

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

    } 
} 
+0

[JavaFX 2.1] (http://www.oracle.com/technetwork/java/javafx/downloads/index.html)에서 앱을 실행 해 보았는데 제대로 작동하는 것 같았습니다. 나는 그 문제를 이해하지 못했다.) 좋은 구현 방법. . . – jewelsea

+0

I jewelsea, 이 테스트를 시도하십시오 : 프리 핸드 라인을 그려 차트 크기를 조정하십시오. 당신은 여전히 ​​문제가 있다는 것을 알게 될 것입니다. – famedoro

+0

참조 http://stackoverflow.com/questions/10453855/javafx-2-chart-and-freehand-zoom – famedoro

답변

1

. 그래프 자체가 포함 된 노드를 찾아야하며 축 또는 장면이 아닌이 노드의 좌표에서만 작업해야합니다.

과도한 좌표 변환을 피하기 위해 장면 대신 해당 노드에 모든 마우스 이벤트를 추가하는 것이 좋습니다.

ScenicView 도구를 사용하면 응용 프로그램을 조사하고 어떤 노드가 어떤 좌표를 갖고 있는지 확인하고 수학을 검증 할 수 있습니다.

관련 문제