2012-04-27 1 views
2

У меня есть код для рисования на XYChart в JavaFX 2.0 У меня проблема, когда я делаю таблицу изменения размера. Когда у меня есть размер, у меня есть проблема перевода со свободными ничьейИзменение размера диаграммы 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), и он, казалось, работал хорошо (возможно, 2.1 исправил проблему или, возможно, Я просто не понял этого вопроса). Хорошая реализация кстати. , , – jewelsea

+0

I jewelsea, попробуйте этот тест: нарисуйте несколько свободных линий, затем измените размер диаграммы. вы поймете, что есть еще проблема. – famedoro

+0

см. Http://stackoverflow.com/questions/10453855/javafx-2-chart-and-freehand-zoom – famedoro

ответ

1

кажется вы координаты основаны на неправильных якорей. Вам нужно найти узел, который содержит сам граф, и работать только с координатами этого узла, а не с осью или сценой.

Я бы даже посоветовал добавить все события мыши к этому узлу вместо сцены, чтобы избежать чрезмерного перевода координат.

Другой совет: использовать инструмент ScenicView, чтобы исследовать ваше приложение и посмотреть, какие узлы имеют какие координаты и проверить вашу математику.

Смежные вопросы