JavaFX Netbeans Aufruf Funktion aus Scenebuilder

Juelin

Bekanntes Mitglied
Hallo zusammen,
ich muss mal wieder nerven.
Folgendes Problem:
Habe eine Pane in Scenebuilder erstellt (siehe bild1).
Habe fenster.fxml Datei erstellt (siehe fenster.zip).
Habe fensterController.java erstellt:

Java:
package com.juelin.projekt8;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
public class fensterController
    {
    @FXML
    private Pane pane;
    @FXML
    private TextField eingabe1;
    @FXML
    private Label anzeige1;
    @FXML
    private Button knopf1;
    public String einfeld;
    @FXML
    void B1Click(ActionEvent event)
        {
        if (knopf1.isVisible())
            {
            System.out.println("Button 1 Click");
            eingabe1.setEditable(true);
            System.out.println("Edittable gesetzt True");
            setEingabe1Editable(Boolean.FALSE);
            System.out.println("Edittable gesetzt False");
            }
        }
    @FXML
    void E1Action(ActionEvent event)
        {
        if (eingabe1.isEditable())
            {
            System.out.println("Edit 1 Enter <"+eingabe1.getText()+">");
            }
        }
    @FXML
    void E1Down(KeyEvent event)
        {
        if (eingabe1.isEditable())
            {
            System.out.println("Edit 1 Down");
            }
        }
    @FXML
    void E1Press(KeyEvent event)
        {
        if (eingabe1.isEditable())
            {
            System.out.println("Edit 1 Press");
            }
        }
    @FXML
    void setAnzeige1Visible(Boolean wert)
        {
        anzeige1.setVisible(wert);
        }
    @FXML
    void setEingabe1Visible(Boolean wert)
        {
        eingabe1.setVisible(wert);
        }
    @FXML
    void setEingabe1Editable(Boolean wert)
        {
        System.out.println("setEingabe1Editable = "+wert);
        eingabe1.setEditable(true);
        }
    @FXML
    String getEingabe1Text()
        {
        return eingabe1.getText();
        }
    @FXML
    void setEingabe1Text(String wert)
        {
        eingabe1.setText(wert);
        }
    public String geteinfeld()
        {
        return einfeld;
        }
    public void seteinfeld(String wert)
        {
        this.einfeld = wert;
        }
    }

//        anzeige1.setVisible(true);
//        anzeige1.setText("   Label 1   ");
//        anzeige1.setTextFill(Color.YELLOW);
//        anzeige1.setFont(Font.font("Arial Bold", FontWeight.BOLD, 30));
//        anzeige1.setBackground(new Background(new BackgroundFill(Color.BLUE,  CornerRadii.EMPTY, Insets.EMPTY)));

//        eingabe1.setVisible(true);
//        eingabe1.setEditable(false);
//        eingabe1.setText("");
//        eingabe1.setFont(Font.font("Arial Bold", FontWeight.BOLD, 30));
//        eingabe1.setBackground(new Background(new BackgroundFill(Color.LIGHTGRAY,  CornerRadii.EMPTY, Insets.EMPTY)));

//        knopf1.setVisible(true);

Mein Main-Programm:

Code:
package com.juelin.projekt8;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
/**
 * JavaFX App
 */
public class App extends Application
    {
    @FXML
    private Pane pane;
    @FXML
    private TextField eingabe1;
    @FXML
    private Label anzeige1;
    @FXML
    private Button knopf1;
    @FXML
    private static Scene scene;
    @FXML
    @Override
    public void start(Stage stage) throws IOException
        {
        scene = new Scene(loadFXML("fenster"), 600, 400, Color.BLACK);
        scene.setFill(Color.BLACK);
        stage.setScene(scene);
        stage.setTitle("mein erstes Programm mit SceneBuilder");
        stage.setX(0);
        stage.setY(0);
        stage.setWidth(600);
        stage.setHeight(400);
        stage.centerOnScreen();
        stage.setResizable(false);
        stage.show();
        fensterController gVarRout = new fensterController();
        gVarRout.setEingabe1Editable(Boolean.TRUE);
        }
    @FXML
    private static Parent loadFXML(String fxml) throws IOException
        {
        FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
        return fxmlLoader.load();
        }
    @FXML
    public static void main(String[] args)
        {
        launch();
        }
    }

Im Main-Programm (Routine start) rufe ich eine Methode "gVarRout.setEingabe1Editable(Boolean.TRUE);" auf.
Im Programm fensterController ist die Methode "@FXML void setEingabe1Editable(Boolean wert)".
Wie man im Protokoll (Output-Run.txt) sehen kann wird zwar der Befehl " System.out.println("setEingabe1Editable = "+wert);"
noch ausgefüht, aber der Befehl "eingabe1.setEditable(true);" läuft auf Fehler.
Das paradoxe daran ist: Ich habe dieselben Befehle im Event "void B1Click(ActionEvent event)" drin und da laufen sie ohne Fehler.

Habe schon mehrere Sachen probiert und ins Internet geschaut, aber nix gefunden.

Hat da Jemand eine Idee? Wäre schön.

Danke und Gruß
Jürgen
 

Anhänge

Du hast zwei Instanzen von deiner Controller Klasse:
  • einmal erzeugt vom FXMLLoader, der bei dieser Instanz dann auch die Felder initialisiert.
  • dann die selbst erstellte Instanz. Da sind dann natürlich die Felder nicht initialisiert und eingabe1 ist null.

Du kannst aber mit dem FXMLLoader alles laden und im Anschluss Dir den Controller geben lassen:
Java:
FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource("fenster.fxml"));
scene = new Scene(loadFXML(fxmlLoader.load(), 600, 400, Color.BLACK);
fensterController gVarRout = fxmlLoader.getController();

Das wäre Code, der paar Zeilen in deiner start Methode von App ersetzen könnte.
 
Hallo Konrad,
wie immer wunderbar geholfen.
Im Befehl: scene = new Scene(loadFXML(fxmlLoader.load(), 600, 400, Color.BLACK);
musste ich aber das loadFXML( raus nehmen.
Sonst kommt Fehler unbekanntes Symbol.
Noch eine Frage: Gibt es in Netbeans einen Befehl womit man den Cursor auf
ein bestimmtes Element setzen kann?
Und wie kann ich gVarRout global machen, damit ich die auch in anderen Routinen nutzen kann?
Nochmals Danke, würde Dich ja einladen auf ein...zwei... Getränke.
Weiss aber nicht wo Du wohnst.
Gruß
Jürgen
 
Zuletzt bearbeitet:
Gibt es in Netbeans einen Befehl womit man den Cursor auf
ein bestimmtes Element setzen kann?
Ich weiß nicht, was genau Du meinst, aber es gibt in NetBeans viele Möglichkeiten, durch den Code zu navigieren.

Zum Beispiel:
  1. Navigator (Strg+7): das ist das Panel, das normalerweise unter dem Projekt-Explorer angezeigt wird. Hier kannst Du zu bestimmten Membern wie Methoden bzw. Instanz- bzw. Klassenvariablen springen.
  2. Die Suche in der Datei (Strg+F) und über das gesamte Projekt bzw. über alle offenen Projekte (Strg+Shift+F). Bei der Suche in der Datei ganz normal mit Next und Previous zwischen den Vorkommen springen. Bei der Suche im Projekt bzw. Projekten im Ergebnisfenster (Search Results) per Doppelklick an die gefundene Stelle springen.
  3. Per Shift+Klick bzw. Strg+B kann zur Deklaration einer Variablen bzw. einer Methode gesprungen werden, die sich unter dem Cursor befindet.
  4. Mit Alt+F7 bzw. Rechtsklick + "Find Usages" kannst Du suchen, wo im Code eine Variable bzw. eine Methode verwendet wird. Im Ergebnisfenster (Usages) kannst Du per Doppelklick direkt an diese Stelle springen
Das wären jetzt mal ein paar Möglichkeiten.

EDIT: hatte versehentlich abgeschickt, daher ergänzt.
 
Zuletzt bearbeitet:
ich meine, das ein bestimmtes Element im Bild (z.B Textfield) den Focus bekommt und dort der Cursor an eine
bestimmte Stelle gesetzt wird.
 
musste ich aber das loadFXML( raus nehmen.
Ja, das habe ich vergessen raus zu löschen. Das typische Problem, wenn man Code im Browser umstellt. Da übersieht man schnell mal so eine Stelle.

ich meine, das ein bestimmtes Element im Bild (z.B Textfield) den Focus bekommt und dort der Cursor an eine
bestimmte Stelle gesetzt wird.
Du kannst die Position des Cursors in einem TextField mittels positionCaret setzen:

Dazu evtl. noch ein requestFocus() um auch den Focus auf das Control zu setzen. Ich habe das jetzt aber nicht getestet und kann daher nichts zu der Notwendigkeit sagen.

new Robot().mouseMove(0, 0);
habe ich schon probiert, funktioniert aber nicht.
Davon kannst Du Dich gleich verabschieden. Du willst ja nicht ein fremdes Programm steuern über Mausbewegungen und so. Du willst Dein Programm steuern und da hast Du ja die volle Kontrolle über alles. Da wäre der Umweg über Maus oder Tastatur ein Umweg, der dann auch leicht auf Grund von Anpassungen dann schnell nicht mehr geht.
 

Neue Themen


Zurück
Oben