2015-06-25 3 views
0

Я пытаюсь создать диаграмму без использования каких-либо сторонних библиотек. У меня есть функция масштабирования, которая правильно масштабирует Canvas, но теперь мне нужно снова перерисовать все внутри холста.Сброс графики JavaFX Контекст после масштабирования холста

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

Вот простой фрагмент кода, который я перерисовки:

private void redrawImage(Canvas canvas, int scale) { 
     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
     gc.scale(scale, scale); 
     gc.setStroke(Color.RED); 
     gc.setLineWidth(2); 
     gc.strokeRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
     gc.setStroke(Color.GREEN); 
     gc.strokeLine(0, 0, canvas.getWidth(), canvas.getHeight()); 
     gc.strokeLine(0, canvas.getHeight(), canvas.getWidth(), 0); 
     gc.setStroke(Color.BLUE); 
     gc.strokeText("TEXT", 50, 50); 

    } 

Даже я удалить gc.scale(X,Y) я все еще вижу BLOTTED точки или текст, я хочу, чтобы масштаб всегда 1, но я должен также увеличить или масштаб одновременно.

То, что я хочу достичь, похоже на наложение GoogleMaps, вы видите, что объекты, когда они увеличены или уменьшены, перекалиброваны и настроены на масштабируемый масштаб. Это именно то, чего я хочу достичь.

ответ

0

Я не знаю, правильно ли я вас понимаю.

Ваш метод redrawImage должен иметь значение double, а не значение int для шкалы. Даже если вы попытаетесь масштабировать до 1,9 бросание из двойной Int будет довести его до 1.

Я сделал небольшой пример:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.canvas.GraphicsContext; 
import javafx.scene.layout.FlowPane; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class JavaFXApplication1 extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

    Canvas canvas = new Canvas(100, 100); 
    Canvas canvas2 = new Canvas(100, 100); 

    FlowPane root = new FlowPane(); 
    root.getChildren().addAll(canvas, canvas2); 

    Scene scene = new Scene(root, 300, 250); 

    primaryStage.setTitle("Hello World!"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
    redrawImage(canvas, 0.5); 
    redrawImage(canvas2, 1); 
    } 

    private void redrawImage(Canvas canvas, double scale) { 
    GraphicsContext gc = canvas.getGraphicsContext2D(); 
    gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
    gc.scale(scale, scale); 
    gc.setStroke(Color.RED); 
    gc.setLineWidth(2); 
    gc.strokeRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
    gc.setStroke(Color.GREEN); 
    gc.strokeLine(0, 0, canvas.getWidth(), canvas.getHeight()); 
    gc.strokeLine(0, canvas.getHeight(), canvas.getWidth(), 0); 
    gc.setStroke(Color.BLUE); 
    gc.strokeText("TEXT", 50, 50); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
    launch(args); 
    } 

} 

следующий результат:

enter image description here

+0

Согласен о масштабировании. Но дело в том, что вы заметили, что «ТЕКСТ» затушевано и не совпадает с масштабируемой видимостью. То, что я хочу достичь, похоже на наложение GoogleMaps, вы видите, что объекты при масштабировании подвергаются повторной калибровке и настройке. Это именно то, чего я хочу достичь. – zIronManBox

+0

А, вы хотите установить размер текста по отношению к масштабу? Но не за фиксированной величиной, так что она всегда читаема? – NwDev

+0

Да. Не только текст. У меня есть объекты, такие как заполненные круги, прямоугольники, которые необходимо изменить соответственно. – zIronManBox

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