JavaFX aus der .fxml Datei einen Konstruktor bedienen

Holger_Hessling

Aktives Mitglied
Hallo Forum,

wie das so ist, löst man das eine Problem, kommt gleich das nächste. Wer kann mir helfen?

Folgendes klitzkleine Testprogramm hab ich geschrieben:
Der Einstieg mit dem Laden der GUI
Code:
package fxmltest;

import java.net.URL;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class FXMLTest extends Application {

   @Override
   public void start(Stage primaryStage) throws Exception {

     URL url = FXMLTest.class.getResource("../gui/gui.fxml");
     Parent root = FXMLLoader.load(url);
     Scene scene = new Scene(root);
     primaryStage.setScene(scene);

     primaryStage.setTitle("FXML Test");
     primaryStage.show();

   }

   public static void main(String[] args) {
     launch(args);
   }
}
Die fxml Beschreibung der GUI
Code:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import viewcontroller.MyButton?>
<?import viewcontroller.MyLabel?>

<BorderPane fx:id="borderPane" xmlns:fx="http://javafx.com/fxml"
       fx:controller="gui.GUIController"

       prefWidth="400" prefHeight="100">
       
   <center>
     <MyButton fx:id="myButton" prefHeight="25" prefWidth="80"/>
   </center>
   
   <bottom>
     <MyLabel fx:id="myLabel" alignment="CENTER" maxWidth="Infinity"/>
   </bottom>
   
</BorderPane>
Dem GUIController
Code:
package gui;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.BorderPane;
import viewcontroller.MyButton;
import viewcontroller.MyLabel;

public class GUIController implements Initializable {

   @FXML
   private BorderPane borderPane;
   @FXML
   private MyButton myButton;
   @FXML
   private MyLabel myLabel;
   
   @Override
   public void initialize(URL location, ResourceBundle resources) {
     myButton.setText("drück' mich");
     myLabel.setText("Ich bin ein Label :-)");
   }

}
Und den beiden 'eigenen' Button und Label
Code:
package viewcontroller;

import javafx.scene.control.Button;

public class MyButton extends Button {

   public MyButton(){
   }
}
Code:
package viewcontroller;

import javafx.scene.control.Label;

public class MyLabel extends Label {

   public MyLabel() {
   }
}
Das erzeugt ein kleines Fenster mit einem Button und einem Label. Nach dem erzeugen werden die Texte der beiden im GUIController noch gesetzt. Man beachte, daß der verwendete Button und der verwendete Label in eigene Klassen vererbt wurden.

Das funktioniert soweit. Wenn ich allerdings bei MyButton und MyLabel im Konstruktor Argumente übergeben möchte, dann compiliert das Ganze nicht mehr.

Kann mir bitte einer sagen, was ich für diesen Fall machen muß?!

VG Holger
 
Cool. Wusste ich nicht, aber kannst du dein Code noch um ein Beispiel erweitern? Könnte ich manchmal auch gebrauchen ;-)
 
Ich hab das mit dem @NamedArg nicht mehr weiter verfolgt, weil ich das für mich jetzt anderes gelöst habe. Den eigenen Controlls (MyButton, MyLabel) habe ich eine Methode init(...) spendiert, die ich aus dem Controller in seiner initialize() explizit aufrufe.
 

Neue Themen


Zurück
Oben