Hi,
ich würde gerne eine zur X-Achse orthogonale Linie über die gesamte Höhe der Szene in der Mitte der Szene haben, sodass die Linie durch den Mittelpunkt der Szene geht.
So wie bei einem Koordinatensystem, dessen Schnittpunkt der Achsen in der Mitte ist.
Meine Überlegung ist, dass ich die X und Y Koordinaten der Linie an die Pane binde.
Allerdings funktioniert dies nicht. Die Linie ist zwar vertikal und orthogonal zur X-Achse, allerdings ist sie an die rechte Wand der Pane gebunden, wieso auch immer.
Ich hoffe, dass ihr mir da helfen könnt.
Mein Code sieht bisher so aus, ich habe vier Linien, also ich habe es auf vier verschiedene Varianten probiert.
Die rote Linie wird erst gar nicht angezeigt.
Die gelbe bleibt in der Mitte und bewegt sich natürlich nicht. Wäre zwar ein Ansatz aber beim zoom-in, zoom-out sollten die Linien sich der Szene anpassen.
Die grüne sehe ich nicht und bei der vierten, der letzten, kommt eine Nullpointer, weil ich keine Ahnung habe, wie ich die primaryStage sonst übergeben soll.
Ich denke ich habe einen guten Ansatz, aber die Stage bleibt trotzdem bei Null.
Habt ihr eine Idee, wie ich mein Vorhaben umsetzen könnte?
Letzten Endes will ich eigentlich nur ein Koordinatensystem basteln, dass sich beim "Resizen" des Fensters auch ändert, wobei der Mittelpunkt immer der Schnittpunkt der beiden Achsen bildet.
Eigentlich dachte ich, dass es trivial sei, wenn ich die Linie an die Pane binde und dementsprechende Rechenoperationen (divide(2)) durchführe, doch divide(2) tut wohl nicht das, was es tun soll, da die Linie ganz rechts festhängt und nicht wie gewollt und gedacht in der Mitte.
Hier die Codes:
Koord - mainApp
hier der Controller
Hilfe nehme ich gerne an
ich würde gerne eine zur X-Achse orthogonale Linie über die gesamte Höhe der Szene in der Mitte der Szene haben, sodass die Linie durch den Mittelpunkt der Szene geht.
So wie bei einem Koordinatensystem, dessen Schnittpunkt der Achsen in der Mitte ist.
Meine Überlegung ist, dass ich die X und Y Koordinaten der Linie an die Pane binde.
Allerdings funktioniert dies nicht. Die Linie ist zwar vertikal und orthogonal zur X-Achse, allerdings ist sie an die rechte Wand der Pane gebunden, wieso auch immer.
Ich hoffe, dass ihr mir da helfen könnt.
Mein Code sieht bisher so aus, ich habe vier Linien, also ich habe es auf vier verschiedene Varianten probiert.
Die rote Linie wird erst gar nicht angezeigt.
Die gelbe bleibt in der Mitte und bewegt sich natürlich nicht. Wäre zwar ein Ansatz aber beim zoom-in, zoom-out sollten die Linien sich der Szene anpassen.
Die grüne sehe ich nicht und bei der vierten, der letzten, kommt eine Nullpointer, weil ich keine Ahnung habe, wie ich die primaryStage sonst übergeben soll.
Ich denke ich habe einen guten Ansatz, aber die Stage bleibt trotzdem bei Null.
Habt ihr eine Idee, wie ich mein Vorhaben umsetzen könnte?
Letzten Endes will ich eigentlich nur ein Koordinatensystem basteln, dass sich beim "Resizen" des Fensters auch ändert, wobei der Mittelpunkt immer der Schnittpunkt der beiden Achsen bildet.
Eigentlich dachte ich, dass es trivial sei, wenn ich die Linie an die Pane binde und dementsprechende Rechenoperationen (divide(2)) durchführe, doch divide(2) tut wohl nicht das, was es tun soll, da die Linie ganz rechts festhängt und nicht wie gewollt und gedacht in der Mitte.
Hier die Codes:
Koord - mainApp
Code:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package koord;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
/**
*
* @author Dave
*/
public class Koord extends Application {
private Stage primaryStage;
private Pane rootLayout;
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
this.primaryStage.setTitle("Koordinatensystem");
initRootLayout();
}
public void initRootLayout() {
try {
// Load root layout from fxml file.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Koord.class.getResource("FXMLDocument.fxml"));
rootLayout = (Pane) loader.load();
FXMLDocumentController controller = loader.getController();
controller.setMain(this);
controller.setSettings();
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
public Stage getPrimaryStage() {
return primaryStage;
}
}
hier der Controller
Code:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package koord;
import java.awt.Color;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Paint;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
/**
*
* @author Dave
*/
public class FXMLDocumentController implements Initializable {
@FXML
private Pane drawPane;
Koord main;
Stage stage;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
public void setMain(Koord main) {
this.main = main;
}
public void setSettings() {
//Erster Versuch
Line line = new Line();
line.setStartX(200);
line.setEndX(200);
line.setStartY(0);
line.setEndY(400);
line.setStroke(Paint.valueOf("yellow"));
//Zweiter Versuch
Line line2 = new Line();
line2.setStartX(drawPane.getWidth() / 2);
line2.setStartY(0);
line2.setEndX(drawPane.getWidth() / 2);
line2.setEndY(drawPane.getHeight());
line2.setStroke(Paint.valueOf("green"));
//Dritter Versuch
Line line3 = new Line();
line3.setStroke(Paint.valueOf("red"));
line3.startXProperty().bind(drawPane.widthProperty().divide(2));
line3.endXProperty().bind(drawPane.widthProperty().divide(2));
line3.startYProperty().bind(drawPane.heightProperty());
line3.endYProperty().bind(drawPane.heightProperty());
Line line4 = new Line();
drawPane.getChildren().add(line);
drawPane.getChildren().add(line2);
drawPane.getChildren().add(line3);
drawPane.getChildren().add(line4);
line4.setStroke(Paint.valueOf("blue"));
//vierter Versuch
main.getPrimaryStage().getScene().widthProperty().addListener((ObservableValue<? extends Number> observableValue,
Number oldSceneWidth, Number newSceneWidth) -> {
System.out.println("Width: " + newSceneWidth);
line4.setStartX(newSceneWidth.doubleValue() / 2);
line4.setEndX(newSceneWidth.doubleValue() / 2);
});
main.getPrimaryStage().getScene().heightProperty().addListener((ObservableValue<? extends Number> observableValue,
Number oldSceneHeight, Number newSceneHeight) -> {
System.out.println("Height: " + newSceneHeight);
line4.setStartY(0);
line4.setEndY(newSceneHeight.doubleValue());
});
}
}
Hilfe nehme ich gerne an