Java JavaFX & XML - Label beim Start in Abhängigkeit von etwas den Text ändern lassen

SparkMonkay

Commander
Registriert
Feb. 2013
Beiträge
2.337
Moin!

Aktuell versuche ich mich mit JavaFX mit XML gefällt mir sehr und der SceneBuilder ist auch angenehm zu benutzen. Nur stecke ich bei einer Sache fest. Wenn ich das Programm starte will ich dass ein Label in abhängigkeit von etwas etwas anderes anzeigt. Also z.B. Datum, Monat, einen String den ich von einer Seite aus dem Internet Parse oder was auch immer.

Aktuell sieht es so bei mir aus:
Die Methode in dem Controller war einer der Sachen die ich getestet habe die aber nicht funktioniert haben, Oder muss ich es "seperat" einfügen um es dann so zu bearbeiten wie ich es gerne hätte? Was ist das einfachste?

Code:
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;

import java.util.Calendar;

public class Controller
{

    @FXML
    Label label = new Label("TEST");

    @FXML
    Button button;

    @FXML
    private void buttonOnAction()
    {
        label.setText("LABEL");
    }

    public void setLabelText(String text)
    {
        label = new Label(text);
    }

}

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

<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>


<HBox fx:controller="Controller" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="96.0" prefWidth="212.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Button fx:id="button" mnemonicParsing="false" onAction="#buttonOnAction" prefHeight="96.0" prefWidth="105.0" text="Button" />
      <Label fx:id="label" prefHeight="96.0" prefWidth="121.0" />
   </children>
</HBox>


Code:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Main extends Application
{


    @Override
    public void start(Stage primaryStage) throws Exception
    {
        FXMLLoader loader = new FXMLLoader();
        Pane mainPane = loader.load(getClass().getResourceAsStream("test.fxml"));

        Controller controller = new Controller();
        controller.setLabelText("TEST");

        Scene scene = new Scene(mainPane);

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Danke sehr!

Grüße Spark
 
Hi,

die Komponenten verwenden JavaFX Properties. So hat ein Label zum Beispiel ein TextProperty.
Dieses kannst du binden und somit dein Label immer aktualisieren.

Dein manuelles
Code:
        Controller controller = new Controller();
        controller.setLabelText("TEST");
kann nicht funktionieren, da diese Controller Instanz nicht die gleiche ist, die deine Scene hat.
FXMLLoader ruft nach den initialisieren eines Controllers aber per Konvention eine Methode initialize auf, sofern sie definiert ist.
So kannst du deine Logik dann auch einbinden um dein Label Initial zu füllen.

Beispiel:

Code:
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;

public class Controller {

	StringProperty irgendeinTollesPropertyMitDeinemText;
	
	@FXML
	Label label = new Label();

	@FXML
	Button button;

	public void initialize(){
		irgendeinTollesPropertyMitDeinemText = new SimpleStringProperty("");
		label.textProperty().bind( irgendeinTollesPropertyMitDeinemText );
		
		System.out.println( "Das steht gerade in deinem Label: " + label.textProperty().get() );
		setLabelText( Math.random()+"" );
		System.out.println( "Das steht jetzt in deinem Label: " + label.textProperty().get() );
	}
	
	@FXML
	private void buttonOnAction() {
		setLabelText( Math.random()+"" );
	}

	public void setLabelText( String text ) {
		irgendeinTollesPropertyMitDeinemText.set( text );
	}
}


Viel Spaß weiterhin. :)
 
Moin!

Danke soweit.
Ich reproduzier mal:
Es wird so wie ich es verstanden habe "alles" über Properties geregelt (insofern ich es in JavaFX über die FXML-Datei mache).

Über meine FXML-Datei wird eine Scene geladen auf die ich nur innerhalb meines Controllers zugreifen kann.

Hast du einen Link wo ich das alles gelistet habe was ich brauche?

Den spaß werde ich daran haben :)
 
Hi, also nein du musst NICHT alles über Properties machen, natürlich kannst du den Text eines Labels oder eines Buttons usw. auch mit z.B lable.setText("hallo"); setzen.

Die Main Methode solltest du Hauptsächlich alles Aufrufen was du von Anfang an hast (z.b den FXML Loader wie du das bereits machst). Später solltest du dann das meiste über den Controller oder über die Controller (Stichwort "Nested Controller") laufen lassen.
 
Lacritz hat recht, du musst nicht. Intern passiert bei setText() aber nichts anderes, als auf ein internes Property des Labels zuzugreifen. Gibt es keins, wird einfach eines erstellt.

Wie auch immer.
Du findest viele Infos auf der Oracle Seite.

http://docs.oracle.com/javase/8/javase-clienttechnologies.htm

Ansonsten einfach mal ein bisschen googlen. Auf jaxenter.de findet sich auch der ein oder andere Artikel.
 
Zurück
Oben