hier ist mein Problem.
Ich will ein Program, welches auf einer Canvas bei gedrückter Maustaste einen Viereck zeichnet,
und wenn ich die Maustaste loslasse, soll anstadt des Vierecks ein Button Erscheinen, mit der Gröse Breite und Position des Vierecks.
das funktioniert jetzt alles bis zu der Stelle wo ich die Maus loslasse und der Button in einer externer Klasse hinzuadiert sein soll.
dies ist übrigens pure Übung und ich wollte daher jeder Aufgabe eine Eigene Klasse schreiben.
mein Problem ist jetzt wie folgt, ich hab eine Klasse wo ich Canvas, Scene, deklariere
und die Stage von der "main" aplication mitgeteilt bekomme (wollte es einfach mal so ausprobieren, wie gesagt, Übung)
sobald die Maus geklickt wird, wird die Klasse MakeRect ausgerufen,
in der Klasse MakeRect wird dann ein Viereck gezeichnet solange die Maustaste gedrückt ist,
und sobald die Maustaste losgelassen wird, will ich die nächste Klasse starten, die dann
ein Objekt (button in meinem fall) dort erstellt, wo x,y, Breite und Höhe weitergeleite werden.
Also sehr grob verkürzt
nun hab ich folgendes Problem, die "MakeButton" klasse hat keine Ahnung von Stage, Scene oder was anderem.
Was wäre denn jetzt die eleganteste Lösung den Knopf mit vorhandenen Maasen auf dem Bildschirm erscheinen zu lassen ?
Musste ich die Information über stage, scene usw immer weiterleiten ?
Kann ich nicht einfach zu dem Zeitpunkt eine neue Scene erstellen und die alte ersetzen ?
Ich gebe zu, ich bin einfach ins JavaFX kopfüber reingesprungen und versuche grade darin zu schwimmen ohne dass ich halbes jahr jede Woche neue Methoden mir einprägen konnte.
Daher klappen manche sachen wie die bind und Propertys sehr gut, aber sowas wie ein Button
erscheinen zu lassen .... da scheitere ich
damit niemand meckert dass ich zuwenig code gegeben habe, hier die Komplette Baustelle,
sry für viele printlines ... ist eine art mein Debuger seid alten Zeiten
Ich will ein Program, welches auf einer Canvas bei gedrückter Maustaste einen Viereck zeichnet,
und wenn ich die Maustaste loslasse, soll anstadt des Vierecks ein Button Erscheinen, mit der Gröse Breite und Position des Vierecks.
das funktioniert jetzt alles bis zu der Stelle wo ich die Maus loslasse und der Button in einer externer Klasse hinzuadiert sein soll.
dies ist übrigens pure Übung und ich wollte daher jeder Aufgabe eine Eigene Klasse schreiben.
mein Problem ist jetzt wie folgt, ich hab eine Klasse wo ich Canvas, Scene, deklariere
und die Stage von der "main" aplication mitgeteilt bekomme (wollte es einfach mal so ausprobieren, wie gesagt, Übung)
Java:
public void DrawTheButton(final Stage stage){
BorderPane pane = new BorderPane();
Scene scene = new Scene(pane, 800,600);
final Canvas canvas = new Canvas(scene.getWidth(),scene.getHeight());
canvas.widthProperty().bind(scene.widthProperty());
canvas.heightProperty().bind(scene.heightProperty());
final GraphicsContext gc = canvas.getGraphicsContext2D();
canvas.setOnMousePressed(new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent event) {
//System.out.println("maus klicked");
MakeRect(event.getX(), event.getY(),canvas, gc); //
}
});
pane.getChildren().add(canvas);
stage.setScene(scene);
stage.show();
sobald die Maus geklickt wird, wird die Klasse MakeRect ausgerufen,
Java:
MakeRect(event.getX(), event.getY(),canvas, gc);
in der Klasse MakeRect wird dann ein Viereck gezeichnet solange die Maustaste gedrückt ist,
und sobald die Maustaste losgelassen wird, will ich die nächste Klasse starten, die dann
ein Objekt (button in meinem fall) dort erstellt, wo x,y, Breite und Höhe weitergeleite werden.
Also sehr grob verkürzt
Java:
canvas.setOnMouseReleased(new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent event) {
MakeButton(xx, yy,width , height);
nun hab ich folgendes Problem, die "MakeButton" klasse hat keine Ahnung von Stage, Scene oder was anderem.
Was wäre denn jetzt die eleganteste Lösung den Knopf mit vorhandenen Maasen auf dem Bildschirm erscheinen zu lassen ?
Musste ich die Information über stage, scene usw immer weiterleiten ?
Kann ich nicht einfach zu dem Zeitpunkt eine neue Scene erstellen und die alte ersetzen ?
Ich gebe zu, ich bin einfach ins JavaFX kopfüber reingesprungen und versuche grade darin zu schwimmen ohne dass ich halbes jahr jede Woche neue Methoden mir einprägen konnte.
Daher klappen manche sachen wie die bind und Propertys sehr gut, aber sowas wie ein Button
erscheinen zu lassen .... da scheitere ich
damit niemand meckert dass ich zuwenig code gegeben habe, hier die Komplette Baustelle,
sry für viele printlines ... ist eine art mein Debuger seid alten Zeiten
Java:
package sample;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import static javafx.scene.shape.ArcType.*;
public class Main extends Application {
public void MakeRect(final double x, final double y, final Canvas canvas, final GraphicsContext gc) {
System.out.println("maus position x = " + x + " y = " + y);
canvas.setOnMouseDragged(new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent event) {
gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
double width;
double height;
System.out.println("x=" + x + " event" + event.getX());
width = x - event.getX();
height = y - event.getY();
//rect muss mit positiven werden gemacht werden
if (width < 0) {
width = width * (-1);
}
;
if (height < 0) {
height = height * (-1);
}
;
//rect muss das oberste linke Ecke des Gebildes finden
// das wird oben links x und y wert.
double xx;
double yy;
if (x > event.getX()) {
xx = event.getX();
} else xx = x;
if (y > event.getY()) {
yy = event.getY();
} else yy = y;
gc.strokeRect(xx, yy, width, height);
}
});
canvas.setOnMouseReleased(new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent event) {
System.out.println("maus released");
double width;
double height;
System.out.println("x=" + x + " event" + event.getX());
width = x - event.getX();
height = y - event.getY();
//rect muss mit positiven werden gemacht werden
if (width < 0) {
width = width * (-1);
}
;
if (height < 0) {
height = height * (-1);
}
;
//rect muss das oberste linke Ecke des Gebildes finden
// das wird oben links x und y wert.
double xx;
double yy;
if (x > event.getX()) {
xx = event.getX();
} else xx = x;
if (y > event.getY()) {
yy = event.getY();
} else yy = y;
gc.strokeRect(xx, yy, width, height);
MakeButton(xx, yy, width, height);
}
});
}
public void MakeButton(double x, double y, double width, double height) {
System.out.println("MAKE BUTTON AKTIVIERT !");
Pane pane = new Pane();
Scene scene = new Scene(pane);
Button scalierButton = new Button("Klick mich an");
scalierButton.setVisible(false);
scalierButton.setLayoutX(x);
scalierButton.setLayoutY(y);
scalierButton.setPrefWidth(width);
scalierButton.setPrefHeight(height);
scalierButton.setVisible(true);
pane.getChildren().add(scalierButton);
}
public void DrawTheButton(final Stage stage) {
BorderPane pane = new BorderPane();
Scene scene = new Scene(pane, 800, 600);
final Canvas canvas = new Canvas(scene.getWidth(), scene.getHeight());
canvas.widthProperty().bind(scene.widthProperty());
canvas.heightProperty().bind(scene.heightProperty());
final GraphicsContext gc = canvas.getGraphicsContext2D();
canvas.setOnMousePressed(new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent event) {
//System.out.println("maus klicked");
MakeRect(event.getX(), event.getY(), canvas, gc);
}
});
pane.getChildren().add(canvas);
stage.setScene(scene);
stage.show();
}
@Override
public void start(Stage stage) {
DrawTheButton(stage);
}
public static void main(String[] args) {
launch(args);
}
}
Zuletzt bearbeitet: