Guten Tag,
hoffentlich kann mir von euch einer weiterhelfen, ich finde die richtige Lösung einfach nicht.
Wenn ich auf eine Zeichenfläche zeichne und dann zoome, wird richtig gezoomt, jedoch ist alles Gezeichnete danach an falscher Stelle. Also nach x/y verschoben, variiert je nach Zoomen und Verschieben der Zeichenfläche.
Theoretisch müsste ich also ermitteln, um welchen x/y- Wert ich, nach dem Zoomen, das neue Zeichnen verschieben müsste, ich komme allerdings einfach nicht darauf.
Damit ihr das schnell selbst ausprobieren könnt, habe ich auf das Relevante gekürzt und eine kleine Main dafür geschrieben.
(Zum Verschieben des Bildes: Alt + Linke Maustaste gedrückt halten. Beim raus zoomen verschwindet das Bild nach unten rechts und muss nach oben verschoben werden. Mit dem Problem habe ich mich noch nicht befasst.)
Main
View
Bei dem Code gibt es die Abfrage ob gescrollt wurde, steht aber für true und false das Gleiche da. Das ist so, weil ich nicht weiß, was ich ändern muss, wenn der Wert true ist, aber das schon vorbereitet und ausprobiert habe. (Leider ohne Erfolg)
Kann mir jemand von euch sagen, wie ich das in den Griff bekomme? Ist mein Ansatz eventuell falsch?
Danke schonmal
Gruß Dominik
hoffentlich kann mir von euch einer weiterhelfen, ich finde die richtige Lösung einfach nicht.
Wenn ich auf eine Zeichenfläche zeichne und dann zoome, wird richtig gezoomt, jedoch ist alles Gezeichnete danach an falscher Stelle. Also nach x/y verschoben, variiert je nach Zoomen und Verschieben der Zeichenfläche.
Theoretisch müsste ich also ermitteln, um welchen x/y- Wert ich, nach dem Zoomen, das neue Zeichnen verschieben müsste, ich komme allerdings einfach nicht darauf.
Damit ihr das schnell selbst ausprobieren könnt, habe ich auf das Relevante gekürzt und eine kleine Main dafür geschrieben.
(Zum Verschieben des Bildes: Alt + Linke Maustaste gedrückt halten. Beim raus zoomen verschwindet das Bild nach unten rechts und muss nach oben verschoben werden. Mit dem Problem habe ich mich noch nicht befasst.)
Main
Java:
package testerei;
import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.stage.Screen;
import javafx.stage.Stage;
public class MainTesterei extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Rectangle2D winsize = Screen.getPrimary().getVisualBounds();
PaintView paintView = new PaintView();
Scene scene = new Scene(paintView, winsize.getWidth(), winsize.getHeight());
primaryStage.setScene(scene);
primaryStage.setTitle("Testerei");
primaryStage.show();
}
public static void main(String[] args) {
launch();
}
}
View
Java:
package testerei;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
public class PaintView extends Pane {
private Rectangle area;
private Canvas paintArea;
private double xc = 0, yc = 0, oldX = 0, oldY = 0;
// scroll - wurde gescrollt, ist dieser Wert true
// trans - wurde das Bild verschoben, ist dieser Wert true
private boolean trans = false, scroll = false;
private GraphicsContext gc;
public PaintView() {
initView();
}
private void initView() {
this.setStyle("-fx-background-color: orange;");
// Erstelle area, in der gezeichnet werden kann. (dass nicht über den
// Rand gemalt wird.)
area = new Rectangle();
area.setWidth(2000);
area.setHeight(3000);
this.setClip(area);
// Erstelle Zeichenfläche mit Größe des Bildes.
paintArea = new Canvas(2000, 3000);
gc = paintArea.getGraphicsContext2D();
gc.setLineWidth(5);
// Listener für mousePressed,Dragged und Released.
// isAltDown ist für das verschieben des Bereichs (Falls das Bild größer
// ist, als das Fenster und somit nicht alles angezeigt wird)
// und nicht die Größe des Bildes geändert wird.
this.setOnMousePressed(e -> {
if (e.isAltDown()) {
xc = e.getX();
yc = e.getY();
} else {
if (scroll) {
if (trans) {
mousePressed((-oldX + e.getX()), (-oldY + e.getY()));
} else {
mousePressed((e.getX()), (e.getY()));
}
} else {
if (trans) {
mousePressed(-oldX + e.getX(), -oldY + e.getY());
} else {
mousePressed(e.getX(), e.getY());
}
}
}
});
// setTranslate verschiebt ImageView, Zeichenfläche, sowie die
// Begrenzung. oldX/Y wird bei mouseReleased auf den Wert gesetzt, um
// den verschoben wurde. also getTranslateX. siehe Zeile 134
// xc/yc ist der Startwert, an dem die Maus gedrückt wurde. xm/ym ist
// der Endwert, an dem die Maus losgelassen wurde
this.setOnMouseDragged(e -> {
if (e.isAltDown()) {
double xm = e.getX();
double ym = e.getY();
paintArea.setTranslateX(oldX - (xc - xm));
paintArea.setTranslateY(oldY - (yc - ym));
area.setTranslateX(oldX - (xc - xm));
area.setTranslateY(oldY - (yc - ym));
} else {
if (scroll) {
if (trans) {
mouseDragged((-oldX + e.getX()), (-oldY + e.getY()));
} else {
mouseDragged((e.getX()), (e.getY()));
}
} else {
if (trans) {
mouseDragged(-oldX + e.getX(), -oldY + e.getY());
} else {
mouseDragged(e.getX(), e.getY());
}
}
}
});
this.setOnMouseReleased(e -> {
if (e.isAltDown()) {
oldX = paintArea.getTranslateX();
oldY = paintArea.getTranslateY();
trans = true;
} else {
if (scroll) {
mouseReleased(e.getX(), e.getY());
} else {
mouseReleased(e.getX(), e.getY());
}
}
});
// wenn gescrollt wird, wird die Größe alle Flächen angepasst, dass das
// bisher gezeichnete an der richtigen Stelle bleibt und nicht
// verschoben wird. zoomFactor ist frei wählbar für ranzoomen >1 und
// raus <1
// deltaY ist der Wert, um den (tatsächlich?) gezoomt wird. Nimmt einen
// negativen Wert an, beim rauszoomen
this.setOnScroll(e -> {
if (scroll == false) {
scroll = true;
}
double zoomFactor = 1.01;
double deltaY = e.getDeltaY();
if (deltaY < 0) {
zoomFactor = 0.99;
}
// scaleFX/FY gesetzt, damit es übersichtlicher ist.
double scaleFX = paintArea.getScaleX() * zoomFactor;
double scaleFY = paintArea.getScaleY() * zoomFactor;
paintArea.setScaleX(scaleFX);
paintArea.setScaleY(scaleFY);
area.setScaleX(scaleFX);
area.setScaleY(scaleFY);
});
getChildren().addAll(paintArea);
}
private void mousePressed(double x, double y) {
gc.beginPath();
gc.stroke();
gc.setStroke(Color.[B][I]AQUA[/I][/B]);
gc.lineTo(x, y);
}
private void mouseDragged(double x, double y) {
gc.lineTo(x, y);
gc.stroke();
}
private void mouseReleased(double x, double y) {
gc.closePath();
}
}
Bei dem Code gibt es die Abfrage ob gescrollt wurde, steht aber für true und false das Gleiche da. Das ist so, weil ich nicht weiß, was ich ändern muss, wenn der Wert true ist, aber das schon vorbereitet und ausprobiert habe. (Leider ohne Erfolg)
Kann mir jemand von euch sagen, wie ich das in den Griff bekomme? Ist mein Ansatz eventuell falsch?
Danke schonmal
Gruß Dominik
Zuletzt bearbeitet: