Ich benutze NetBeans 8.1 und den Scene Builder, um ein GUI mit JavaFX und FXML zu erstellen. Es soll ein Dreieck gezeichnet werden, das später beliebig verschoben und rotiert werden kann. Bei letzterem bin ich aber noch nicht. Bis jetzt habe ich noch ein Problem damit das Dreieck überhaupt zu zeichnen. Dazu hier der komplette Quellcode meiner App:
NewFXMain.java:
FXMLDocumentController.java:
FXMLDocument.fxml:
Ausführbar ist der Code so leider nicht, da es noch ein Problem mit der Zeile
gibt. Da ist die Fehlermeldung: "getChildren() has protected access in Parent".
Kann mir jemand einen Hinweis (oder vielleicht auch Code) geben, was ich in NewFXMain.start machen muss, um das Dreieck auf dem Canvas des GUIs zu zeichnen? Vielen Dank schon mal!
NewFXMain.java:
Java:
package grafikprogramm_dreieck;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Point2D;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class NewFXMain extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));
Parent root = (Parent) loader.load();
FXMLDocumentController controller = (FXMLDocumentController) loader.getController();
GraphicsContext gc = controller.canvas.getGraphicsContext2D();
zeichneDreieck(gc);
root.getChildren().add(controller.canvas);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public void zeichneDreieck(GraphicsContext gc) {
Point2D p1 = new Point2D(0.0, 0.0);
Point2D p2 = new Point2D(200.0, 200.0);
Point2D p3 = new Point2D(200.0, 0.0);
gc.setStroke(Color.BLUE);
gc.setLineWidth(5);
gc.strokeLine(p1.getX(),p1.getY(),p2.getX(),p2.getY());
gc.strokeLine(p2.getX(),p2.getY(),p3.getX(),p3.getY());
gc.strokeLine(p3.getX(),p3.getY(),p1.getX(),p1.getY());
}
}
FXMLDocumentController.java:
Java:
package grafikprogramm_dreieck;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.TextField;
public class FXMLDocumentController implements Initializable {
@FXML public TextField horizStrecke_textField;
@FXML public TextField vertStrecke_textField;
@FXML public TextField winkel_textField;
@FXML public Canvas canvas;
@FXML
public void handleButtonTranslate(ActionEvent event) {
System.out.println("Verschieben um "+horizStrecke_textField.getText()+" nach rechts/links "+
"und verschieben um "+vertStrecke_textField.getText()+" nach oben/unten");
//verschiebeDreieck();
}
@FXML
public void handleButtonRotate(ActionEvent event) {
System.out.println("Rotieren um "+winkel_textField.getText());
//rotiereDreieck();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// ...
}
public void verschiebeDreieck() {
// ...
}
public void rotiereDreieck() {
// ...
}
}
FXMLDocument.fxml:
Java:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.canvas.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="700.0" prefWidth="700.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="grafikprogramm_dreieck.FXMLDocumentController">
<children>
<VBox prefHeight="700.0" prefWidth="700.0">
<children>
<HBox alignment="CENTER_LEFT" prefHeight="39.0" prefWidth="700.0">
<children>
<Label alignment="BASELINE_RIGHT" contentDisplay="CENTER" text="Horizontale Strecke">
<font>
<Font size="15.0" />
</font>
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Label>
<TextField fx:id="horizStrecke_textField" prefHeight="28.0" prefWidth="69.0" promptText="0 Pixel">
<font>
<Font size="15.0" />
</font>
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</TextField>
<Label alignment="BASELINE_RIGHT" contentDisplay="CENTER" text="Vertikale Strecke">
<font>
<Font size="15.0" />
</font>
<HBox.margin>
<Insets left="30.0" />
</HBox.margin>
</Label>
<TextField fx:id="vertStrecke_textField" prefHeight="28.0" prefWidth="69.0" promptText="0 Pixel">
<font>
<Font size="15.0" />
</font>
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</TextField>
<Button fx:id="verschieben_button" mnemonicParsing="false" onAction="#handleButtonTranslate" text="Verschieben">
<HBox.margin>
<Insets left="30.0" />
</HBox.margin>
<font>
<Font size="15.0" />
</font>
</Button>
</children>
</HBox>
<HBox alignment="CENTER_LEFT" prefHeight="39.0" prefWidth="700.0">
<children>
<Label text="Winkel">
<font>
<Font size="15.0" />
</font>
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Label>
<TextField fx:id="winkel_textField" prefHeight="29.0" prefWidth="99.0" promptText="+/- 0.0°">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
<font>
<Font size="15.0" />
</font>
</TextField>
<Button fx:id="rotieren_button" mnemonicParsing="false" onAction="#handleButtonRotate" text="Rotieren">
<HBox.margin>
<Insets left="30.0" />
</HBox.margin>
<font>
<Font size="15.0" />
</font>
</Button>
</children>
</HBox>
<Canvas fx:id="canvas" height="624.0" width="700.0" />
</children>
</VBox>
</children>
</AnchorPane>
Ausführbar ist der Code so leider nicht, da es noch ein Problem mit der Zeile
Java:
root.getChildren().add(controller.canvas);
Kann mir jemand einen Hinweis (oder vielleicht auch Code) geben, was ich in NewFXMain.start machen muss, um das Dreieck auf dem Canvas des GUIs zu zeichnen? Vielen Dank schon mal!