JavaFX Verwendung einer ResizableCanvas-Klasse in fxml-Datei

732E772E

Mitglied
Ich möchte, dass das, was ich auf einer Canvas zeichne, sich entsprechend verändert, wenn ich das GUI-Fenster - und damit auch die Canvas - in seiner Größe verändere (z. B.: wenn ich etwas in der Mitte der Canvas zeichne, dann soll es auch in der Mitte bleiben, wenn ich das GUI-Fenster vergrößere/verkleinere). Dafür habe ich ein Beispielprogramm gefunden, dass die GUI-Erstellung in einer einzigen java-Datei erledigt. Das ist der Quellcode:

Java:
package javafxapplication5;

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

public class Main extends Application {
   
  class ResizableCanvas extends Canvas {
  public ResizableCanvas() {
  // Redraw canvas when size changes.
  widthProperty().addListener(evt -> draw());
  heightProperty().addListener(evt -> draw());
  }
  private void draw() {
  double width = getWidth();
  double height = getHeight();
  GraphicsContext gc = getGraphicsContext2D();
  gc.clearRect(0, 0, width, height);
  gc.setStroke(Color.RED);
  gc.strokeLine(0, 0, width, height);
  gc.strokeLine(0, height, width, 0);
  }
  @Override
  public boolean isResizable() {
  return true;
  }
  @Override
  public double prefWidth(double height) {
  return getWidth();
  }
  @Override
  public double prefHeight(double width) {
  return getHeight();
  }
  }

  @Override
  public void start(Stage stage) throws Exception {
  ResizableCanvas canvas = new ResizableCanvas();
  StackPane stackPane = new StackPane();
  stackPane.getChildren().add(canvas);
  // Bind canvas size to stack pane size.
  canvas.widthProperty().bind(
  stackPane.widthProperty());
  canvas.heightProperty().bind(
  stackPane.heightProperty());
  stage.setScene(new Scene(stackPane));
  stage.setTitle("Tip 1: Resizable Canvas");
  stage.show();
  }

  public static void main(String[] args) {
  launch(args);
  }
}

Nun möchte ich die Funktionsweise der ResizableCanvas-Klasse für ein komplexeres GUI übernehmen und mein GUI mit dem NetBeans-Scene Builder erstellen. Ich muss also noch eine fxml-Datei und eine Controller-Klasse ertellen. Die ResizableCanvas-Klasse habe ich aus Main-Klasse entfernt und in eine extra Klasse, die ResizableCanvas-Klasse, gepackt. Meine fxml-Datei für ein sehr simples GUI sieht so aus:

Java:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.canvas.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafxapplication5.ResizableCanvas?>

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
  <children>
    <ResizableCanvas height="400.0" width="600.0" />
  </children>
</AnchorPane>

So, nun zu meiner eigentlichen Frage: Das Programm als Ganzes ist noch nicht ausführbar, da ich Main.start noch modifizieren muss, aber bevor ich dazu übergehe, zeigt mir NetBeans in der fxml-Datei an, wenn ich mit dem Mauszeiger über die Zeile "<ResizableCanvas height="400.0" width="600.0" />" fahre, dass...

Code:
Instances of javafxapplication5.ResizableCanvas cannot be created by FXML loader.

Kann mir von euch jemand sagen, wie ich meine ResizableCanvas-Klasse in fxml nutzbar machen kann? Müsste ich evtl. etwas an meine custom Canvas-Klasse ändern? Vielen Dank im Voraus für eure Hilfe!
 

732E772E

Mitglied
Hi, dzim! Danke erstmal für deine Antwort. Die von dir genannte Internetadresse ist diejenige, von der ich mein obiges Beispiel mit der inneren ResizableCanvas-Klasse herhabe. Ich habe sie aus der Main-Klasse herausgenommen und in eine eigenständige Klasse extrahiert. Die Main-Klasse JavaFXApplication5 ist noch nicht lauffähig; da war ich noch am Rumprobieren, wollte aber erstmal das Problem mit der Verwendung der ResizableCanvas-Klasse in der fxml-Datei lösen. Okay, hier also der Quellcode:

JavaFXApplication5.java
Java:
package javafxapplication5;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import static javafx.application.Application.launch;

public class JavaFXApplication5 extends Application {
   
  @Override
  public void start(Stage stage) throws Exception {
  //ResizableCanvas canvas = new ResizableCanvas();
  //StackPane stackPane = new StackPane();
  //stackPane.getChildren().add(canvas);
  // Bind canvas size to stack pane size.
  canvas.widthProperty().bind(stackPane.widthProperty());
  canvas.heightProperty().bind(stackPane.heightProperty());
  stage.setScene(new Scene(stackPane));
  stage.setTitle("Tip 1: Resizable Canvas");
  stage.show();
  }
  public static void main(String[] args) {
  launch(args);
  }
}

ResizableCanvas.java
Java:
package javafxapplication5;

import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;

class ResizableCanvas extends Canvas {
  public ResizableCanvas() {
  // Redraw canvas when size changes.
  widthProperty().addListener(evt -> draw());
  heightProperty().addListener(evt -> draw());
  }
  private void draw() {
  double width = getWidth();
  double height = getHeight();
  GraphicsContext gc = getGraphicsContext2D();
  gc.clearRect(0, 0, width, height);
  gc.setStroke(Color.RED);
  gc.strokeLine(0, 0, width, height);
  gc.strokeLine(0, height, width, 0);
  }
  @Override
  public boolean isResizable() {
  return true;
  }
  @Override
  public double prefWidth(double height) {
  return getWidth();
  }
  @Override
  public double prefHeight(double width) {
  return getHeight();
  }
}

Controller.java
Java:
package javafxapplication5;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;

public class Controller {
     @FXML private ResizableCanvas canvas;

     @FXML
     public void initialize(URL url, ResourceBundle rb) {
  //
  }
}

FXML.fxml
Java:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.canvas.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafxapplication5.ResizableCanvas?>

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
  <children>
  <ResizableCanvas height="400.0" width="600.0" />
  </children>
</AnchorPane>

Bin nach wie vor sehr dankbar für jede Hilfe!
 

dzim

Top Contributor
Ich habe es gerade mal probiert: Was geht? Dass ich es per FXML einbinden kann (ich habe es an der entsprechenden Stelle nur noch mal in ein Pane gewrappt - StackPane oder VBox...).

Aber: Wenn ich das so einbinde, dann haut es mit den Grössen des Canvas irgendwie nicht hin...
Bei mir wird das Canvas dann stets grösser, nie kleiner.

Sorry, aber zu mehr als den kleinen Test hier, habe ich leider keine Zeit.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R 3D-Grafik Verwendung mehrerer Texturen AWT, Swing, JavaFX & SWT 1
T ThreadPool sicher beenden unter Verwendung von swt.widgets.Display.syncExec AWT, Swing, JavaFX & SWT 1
C AWT Verwendung von Buttons in Spielen AWT, Swing, JavaFX & SWT 8
C Swing Kleines Programm mit SWING unter Verwendung von MVC AWT, Swing, JavaFX & SWT 5
W Mouseclicks werden bei Verwendung anderen Betriebssystems nicht problemlos angenommen AWT, Swing, JavaFX & SWT 3
H Probleme bei der Verwendung vom JProgressMonitor AWT, Swing, JavaFX & SWT 3
W Optimierung bei JTable Verwendung AWT, Swing, JavaFX & SWT 3
H Probleme bei Verwendung von Swing-Komponenten AWT, Swing, JavaFX & SWT 16
M .txt unter Verwendung von JSpinner in Textfeld schreiben AWT, Swing, JavaFX & SWT 4
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
G Verknüpfung einer pdf Datei AWT, Swing, JavaFX & SWT 2
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
@SupressWarnings() JavaFX Auf den Controller einer ListCell zugreifen AWT, Swing, JavaFX & SWT 4
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
B Textfelder in einer ListView ausgeben AWT, Swing, JavaFX & SWT 13
J Searchfunktion auf einer MS Access Datenbank AWT, Swing, JavaFX & SWT 7
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
M Inhalte einer FlowPane AWT, Swing, JavaFX & SWT 4
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
FRI3ND JavaFX: Wie kann ich einer Scene Argumente übergeben? AWT, Swing, JavaFX & SWT 14
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
K JavaFX ViewTable mit einer LinkedList befüllen AWT, Swing, JavaFX & SWT 3
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
MiMa Selektion aus einer ListView AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
D JavaFX Einbinden einer .fxml AWT, Swing, JavaFX & SWT 1
B Zeile einer Tabelle selektieren AWT, Swing, JavaFX & SWT 1
A Prüfung einer Eingabe auf Gleitkommazahl AWT, Swing, JavaFX & SWT 5
J Suchmaschine einer Datenbank AWT, Swing, JavaFX & SWT 5
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
M Auswahl aus einer ListView AWT, Swing, JavaFX & SWT 3
J JavaFX - Felder (Label) in einer ForSchleife bearbeiten AWT, Swing, JavaFX & SWT 4
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
L Dynamischer Aufbau einer Tabelle über Objekte AWT, Swing, JavaFX & SWT 2
C JavaFX Tief setzen in der Überschrift einer Tabellenspalte AWT, Swing, JavaFX & SWT 3
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
P JavaFX Slider soll Value erst ab einer bestimmten Bedinung aendern AWT, Swing, JavaFX & SWT 19

Ähnliche Java Themen

Neue Themen


Oben