SceneBuilder und Objektname

Juelin

Bekanntes Mitglied
Hallo,
habe mit Scenebuilder eine Pane erstellt und dort ein Label, ein TextField und ein Button plaziert.
Habe Datei "fenster2.fxml" in resources gespeichert und Datei "fenster2Controller.java" in java gespeichert (Netbeans).
Habe das Programm in Netbeans laufen lassen und es läuft auch einwandfrei.
Nun zu meiner Frage:
normaler weise legt man ja ein Objekt an mit "Label meinlabel = new Label()"
Das Objekt hat den Namen: meinlabel.
Wie ist das aber wenn ich das fenster mit Scenebuilder erstellt habe?
Was ist dann der Name vom Label? Ist das die Id?
und wie spricht man im Programm in Netbeans das Label an?
Habe dem Label in Scenebuilder die Id = L1 gegeben.
Aber in Netbeans im Programm fenster2Controller kennt er das Label (L1) nicht.
Bräuchte mal Hilfe.
Danke und Gruß
Jürgen
 

KonradN

Super-Moderator
Mitarbeiter
Wenn Du ein fxml über den FXMLLoader lädst, dann erstellt der FXMLLoader auch eine Instanz der Klasse, die als controller angegeben wurde.

In diesem Controller werden dann im Nachgang auch Instanzvariablen initialisiert. Dies sind dann in der Regel Felder, die so definiert wurden:
@FXML private Label L1;
und da wird dann das control zugewiesen mit der fx:id "L1".

Hier aber gleich die Anregung:
  • Die Namensgebung der Felder ist lower CamelCase. Daher sollte die Variable l1 heissen statt L1 und somit sollte auch die id entsprechend sich verändern. Und natürlich sollten die Namen etwas sinnvolles aussagen. l1 sagt nichts aus! Immer aussagekräftige Bezeichner verwenden!
  • Das @FXML in in der Regel in der Zeile oberhalb und nicht auf der gleichen Zeile
  • Hinweis zum @FXML - das ist nicht zwingend notwendig. Wenn es statt private public wäre, dann würde es auch ohne diese Annotation gehen.

Ich habe mal schnell nach einem Link geschaut und https://edencoding.com/dependency-injection/ könnte die Thematik beschreiben. Ich habe es aber nicht im Detail gelesen sondern nur minimal überflogen.
 

Baerdoc

Mitglied
Ist denn dein Label auch in der Controllerklasse mit entsprechender Annotation @FXML deklariert? (Für die ID würde ich eher etwas aussagekräftigere Bezeichnungen wählen und diese "klein" schreiben)

z.B.
Java:
z.B. @FXML private Label meinErstesLabel;

(da war ich zu langsam :))
 
Zuletzt bearbeitet:

Juelin

Bekanntes Mitglied
Hallo Konrad,
habe mir Dein https://edencoding.com/dependency-injection/ mal angesehen. Puh da wird einem ja schwindelig.
Also das ist zu hoch für mich.
Also nochmal mein Problem:
Ich möchte die Eingabe vom TextField Id:eingabe1 in dem ActionEvent ausgeben. (siehe bild1,App.java, fenster2Controller.java ).
Da bekomme ich aber die Fehlermeldung () (siehe Fehler.txt).
Kannst Du mir da helfen?
Danke und Gruß
Jürgen
 

Anhänge

  • bild1.jpg
    bild1.jpg
    56,2 KB · Aufrufe: 0
  • App.java
    979 Bytes · Aufrufe: 0
  • fenster2Controller.java
    752 Bytes · Aufrufe: 0
  • Fehler.txt
    5,9 KB · Aufrufe: 0

KonradN

Super-Moderator
Mitarbeiter
Code und Fehler bitte über den Knopf </> links oberhalb des Eingabebereiches posten. Das ist einfacher zu lesen als die Anhänge.

Und es fehlt das fxml - poste bitte auch das fxml. Das Bildschirmfoto sagt erst einmal nichts aus.

Prinzipiell sieht der Code selbst korrekt aus. Daher vermute ich, dass Du in dem fxml dem Textfield nicht das Attribut fx:id="eingabe1" hinzugefügt hast.

Das die Bindings stimmen kann man übrigens auch im SceneBuilder sehen. Da sollten die Verlinkungen eigentlich auch gezeigt werden.
 

KonradN

Super-Moderator
Mitarbeiter
Als erstes eine kleine Erläuterung, wie Du so Code am besten posten kannst:

Bildschirmfoto 2024-03-19 um 17.30.13.png

Du erkennst den Eingabebereich und links darüber den rot umkreisten Knopf </>
==> Darüber postest Du bitte Code. Wenn Du da drauf klickst, dann öffnet sich ein Fenster:
Bildschirmfoto 2024-03-19 um 17.33.04.png

Du erkennst erst einmal eine Auswahlbox für die Sprache. Das kann also Java sein für Java Code oder XML für FXML oder einfach allgemeiner Code für beliebigen Text. Und in das Kästchen darunter kannst Du per Copy & Paste den Code kopieren.

Für Dein fxml würden wir dann sowas erhalten:
XML:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.juelin.projekt8.fenster2Controller">
   <children>
      <Button id="knopf1" layoutX="109.0" layoutY="237.0" mnemonicParsing="false" onAction="#B1Click" prefHeight="102.0" prefWidth="383.0" text="knopf1" textAlignment="CENTER" textFill="#f20404">
         <font>
            <Font name="DejaVu Sans Bold" size="48.0" />
         </font>
      </Button>
      <Label id="anzeige1" alignment="CENTER" layoutX="82.0" layoutY="123.0" prefHeight="53.0" prefWidth="157.0" text="anzeige1" textAlignment="CENTER" textFill="#f7e707">
         <font>
            <Font name="Arial Black" size="24.0" />
         </font>
      </Label>
      <TextField id="eingabe1" editable="false" layoutX="239.0" layoutY="123.0" onAction="#E1Action" onKeyPressed="#E1Press" onKeyTyped="#E1Down" text="eingabe1">
         <font>
            <Font name="Arial Black" size="24.0" />
         </font>
      </TextField>
   </children>
</Pane>

Was dann auch direkt lesbar ist. Die Dateianhänge kann ich z.B. auf dem Smartphone nicht ansehen. Jetzt musste ich erst das ZIP herunter laden, entpacken um dann die Datei zu editieren ... natürlich auf dem Computer ... Das ist nicht ganz so toll.
 

KonradN

Super-Moderator
Mitarbeiter
Bei dem Code hast Du die id falsch angegeben. Die id ist aus einem Namespace, der im XML angegeben wurde:
xmlns:fx="http://javafx.com/fxml/1"

Daher musst Du Attribute aus diesem Namespace auch entsprechend mit fx: angeben. Wenn Du dies nicht machst, wäre es ein Element aus dem Namespace xmlns="http://javafx.com/javafx/21"

Das Attribut muss also sein:
fx:id="eingabe1"

Das müsste der SceneBuilder aber auch automatisch richtig machen. Dazu einfach das Control auswählen und da dann den Bereich Code anzeigen lassen. Ich habe es einfach einmal mit einem Button schnell nachgestellt:
Bildschirmfoto 2024-03-19 um 17.39.17.png

Und auch da siehst Du die Beschriftung als fx:id - und nicht einfach id.
 

Juelin

Bekanntes Mitglied
Konrad super.
Recht herzlichen Dank.
Das muss man halt wissen.
Wenn man neu ist, wie ich, sucht man sich zu tode.
Nun noch eine Frage.
Beim Textield gibt es ja die Eigenschaft Editable.
Die kann man auch setzen mit setEditable():
Aber wie um Himmels Willen fragt man die Eigenschaft ab.
Es gibt kein getEditable.
Danke und Gruß
Jürgen
 

M.L.

Top Contributor
In kurz geht es bei der Dependency Injection darum veränderliche Teile einer Software auszulagern und weniger veränderliche Teile zusammenzufassen (eine KI wie Google Gemini wird hierzu mehr schreiben)
 

KonradN

Super-Moderator
Mitarbeiter
Beim Textield gibt es ja die Eigenschaft Editable.
Die kann man auch setzen mit setEditable():
Aber wie um Himmels Willen fragt man die Eigenschaft ab.
In JavaFX ist es üblich, dass so Eigenschaften der UI in Properties gespeichert wird. Dann hast Du eine Methode zum Setzen (so wie hier das setEditable) und eine Property (Hier editableProperty).

Bei sowas würde ich Dir immer raten, einfach einmal zu Overview (JavaFX 21) (openjfx.io) zu gehen.
Du hast rechts im oberen Bereich ein Textfeld - da kannst Du dann TextField eingeben um zu der Klasse zu gehen. Dann bist Du bei:
TextField (JavaFX 21) (openjfx.io)

Dort kannst Du dann nach der Methode / den Properties schauen. setEditable ist geerbt und kommt von der Klasse TextInputControl. Wenn Du auf die Methode klickst, kommst Du zu
TextInputControl (JavaFX 21) (openjfx.io) und siehst in der Beschreibung unter anderem:
Sets the value of the editable property.

Und die Property kommt auch direkt nach dem Setter - also man muss gar nicht gross suchen sondern nur etwas nach unten scrollen.

Und dann könnte man noch auf den Typ "BooleanProperty" klicken, wenn man sich mit Properties noch nicht auskennt. Aber dort gibt es die Methode getValue und mit der bekommst Du den Wert.

Dieser Weg über Properties wird aus zwei wichtigen Gründen gemacht
a) Du kannst die Property an eine andere binden. Du kannst also ein ViewModel (wenn du nach MVVM vorgehst, aber sieh es einfach als eine Klasse mit Daten an) haben, in der Du dann eine SimpleBooleanProperty hast. Die kannst Du binden und dann kannst Du einfach diese SimpleBooleanProperty nutzen um den Wert auszulesen oder zu verändern. Die Stärke wird deutlich, weil Du halt zum einen diese Klasse mit der Property unabhängig von der Oberfläche bauen kannst. Du musst also die genaue UI nicht kennen, um die Logik zu bauen, dass etwas in bestimmten Situationen eben nicht editierbar ist oder so.
b) Du hast dann ggf. nur eine zentrale Property. Und da können 100 Controls dran stecken. Im Code hast Du aber nur eine Property zu setzen und bei der Erstellung der UI machst Du nur einmal das Binding für jedes Control.
 

Juelin

Bekanntes Mitglied
Es ist wie immer gewusst wo.
Nochmals Danke. Ich finde es Toll wie Du den Anfängern hilfst.
Habe jetzt gefunden Methode isEditable().
Klappt prima.
So ich habe genug genervt.
Einen schönen Abend und nochmals Danke
Jürgen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin StringGrid in SceneBuilder und javaFX AWT, Swing, JavaFX & SWT 3
Juelin JavaFX Netbeans Aufruf Funktion aus Scenebuilder AWT, Swing, JavaFX & SWT 8
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
Encera TableView Zeilen als Spalten im SceneBuilder AWT, Swing, JavaFX & SWT 0
berserkerdq2 Wie greife ich auf ein Element zu, welches ich beim Scenebuilder erstellt habe AWT, Swing, JavaFX & SWT 10
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
thor_norsk JavaFX, FXML und SceneBuilder AWT, Swing, JavaFX & SWT 6
melaniemueller JavaFX Taschenrechner mit SceneBuilder AWT, Swing, JavaFX & SWT 12
L JavaFX JavaFX, MVVM und SceneBuilder AWT, Swing, JavaFX & SWT 4
C JavaFX Veränderungen in Scenebuilder in Eclipse als Quellcode anzeigen lassen AWT, Swing, JavaFX & SWT 11
S SceneBuilder gridpane erweitern AWT, Swing, JavaFX & SWT 0
K JavaFX Fenstergröße ändert sich (Gluon - SceneBuilder) AWT, Swing, JavaFX & SWT 23
J Bilder aus dem SceneBuilder werden in der Jar nicht dargestellt AWT, Swing, JavaFX & SWT 4
N SceneBuilder wie auf Attribute zugreifen? Diese sind immer null. AWT, Swing, JavaFX & SWT 6
C JavaFX Edit TableView in Verbindung mit SceneBuilder AWT, Swing, JavaFX & SWT 1
F FXML Datei aus dem SceneBuilder in Eclipse aufrufen AWT, Swing, JavaFX & SWT 1
J SceneBuilder TableView Checkbox AWT, Swing, JavaFX & SWT 1
emma_louisa JavaFX Werte beim Aufrufen des Fensters übernehmen (SceneBuilder) AWT, Swing, JavaFX & SWT 3
B Java FX FXML Textarea SceneBuilder als XML Editor AWT, Swing, JavaFX & SWT 1
M Java FX SceneBuilder 2.0, FXML, Controller AWT, Swing, JavaFX & SWT 1
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
J JavaFx/SceneBuilder/Felder beim verlassen prüfen AWT, Swing, JavaFX & SWT 1
Tom299 JavaFX SceneBuilder download AWT, Swing, JavaFX & SWT 7
P JavaFX SceneBuilder 2.0 AWT, Swing, JavaFX & SWT 7
V JavaFX SceneBuilder startet nicht AWT, Swing, JavaFX & SWT 18
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A Drag and Drop mit JAVAFX- Scenebuilder AWT, Swing, JavaFX & SWT 1
H JavaFx - SceneBuilder - Connect ControllerClass AWT, Swing, JavaFX & SWT 0
R JavaFX Mein SceneBuilder Projekt AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben