尝试将标签文本设置为文本字段输入

Trying to set a lable text to a textfields input

我和我的朋友正在尝试做一个测验,我们都是编程新手,我们遇到的问题是我们无法从 namnSpelare1.setPromptText("Spelare 1"); 获得输入。设置为 label5 文本。这是我们尝试用“ label5.setText("Fråga till " + namnSpelare1.getText() + "."); 做的行,但它不起作用。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import com.sun.javafx.scene.LayoutFlags;
import javax.swing.*;
import java.beans.beancontext.BeanContext;

public class Main extends Application  {






    TextField namnSpelare1 = new TextField();
    TextField namnSpelare2 = new TextField();
    TextField namnSpelare3 = new TextField();
    TextField namnSpelare4 = new TextField();



    Label label5 = new Label("");

    Stage window;
    Scene scene1, scene2, scene3, scene4;
    Button buttonRoles, buttonStart, buttonBack1, buttonBack2, buttonDone1, ButtonBack3;
    LayoutFlags layout1, layout2, layout3, layout4;


    @Override
    public void init() throws Exception { //Vad som händer innan programmet startat.
        System.out.println("Before");
    }







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

        //Vad som händer när programmet startar.
        window = primaryStage;




        //Sidan "START"
        Label label1 = new Label("Vällkommen till Quizera!");
        label1.setFont(new Font("Arial", 18));
        buttonStart = new Button("START");
        buttonRoles = new Button("REGLER");
        buttonRoles.setOnAction(e -> window.setScene(scene2));
        buttonStart.setOnAction(e -> window.setScene(scene3));
        VBox layout1 = new VBox(20);//Radavstånd
        layout1.setPadding(new Insets(30, 50, 100, 185)); //Tak, Höger Vägg, Golvet, Vänster Vägg
        buttonStart.setPadding(new Insets(30, 88.5, 30, 88.5));
        buttonRoles.setPadding(new Insets(30, 85, 30, 85));
        layout1.getChildren().addAll(label1, buttonStart, buttonRoles);
        scene1 = new Scene(layout1, 600, 300);


        //Sidan "Regler"
        Label label2 = new Label("Regler");
        label2.setFont(new Font("Arial", 18));
        Label label4 = new Label("Den spelare som först får 7 rätt vinner.");
        label4.setFont(new Font("Arial", 11));
        Button buttonBack1 = new Button("TILLBAKA");
        buttonBack1.setOnAction(e -> window.setScene(scene1));
        VBox layout2 = new VBox(20);
        layout2.setPadding(new Insets(30, 50, 100, 185)); //Tak, Höger Vägg, Golvet, Vänster Vägg
        buttonBack1.setPadding(new Insets(10, 88.5, 10, 88.5));
        layout2.getChildren().addAll(label2, label4, buttonBack1);
        scene2 = new Scene(layout2, 600, 300);
        window.setScene(scene1);
        window.setTitle("Quizera");
        window.show();

        //Creating a GridPane container
        GridPane grid = new GridPane();
        grid.setPadding(new Insets(10, 10, 10, 10));
        grid.setVgap(5);
        grid.setHgap(5);

        //Sidan "Spelarnas namn?"

        Label label3 = new Label("Fyll i spelarnas namn.");
        label3.setFont(new Font("Arial", 18));



        namnSpelare1.setPromptText("Spelare 1");
        namnSpelare2.setPromptText("Spelare 2");
        namnSpelare3.setPromptText("Spelare 3");
        namnSpelare4.setPromptText("Spelare 4");



        //Button button = new Button("TILLBAKA");
        Button buttonDone1 = new Button("KLAR");



        Button buttonBack2 = new Button("TILLBAKA");
        buttonBack2.setOnAction(e -> window.setScene(scene1));
        buttonDone1.setOnAction(e -> window.setScene(scene4));
        VBox layout3 = new VBox(12);
        buttonBack2.setPadding(new Insets(8, 88.5, 8, 88.5));
        buttonDone1.setPadding(new Insets(8, 100, 8, 100));
        layout3.setPadding(new Insets(18, 185, 100, 185));//Tak, Höger Vägg, Golvet, Vänster Vägg
        layout3.getChildren().addAll(label3, namnSpelare1, namnSpelare2, namnSpelare3, namnSpelare4, buttonDone1, buttonBack2);
        scene3 = new Scene(layout3, 600, 300);




        //Fråga 1
        int randomNum = (int)(Math.random() * 3);
        String[] questions = {"Vilken färg har ett blåbär?", "Vad heter Isabel?", "Hur hög är en två meter hög låda"};
        String[] answers = {"blå", "isabel", "två meter"};



        String namn1 = (namnSpelare1.getText());
        Label label6 = new Label(questions[randomNum]);
        label5.setFont(new Font("Arial", 11));
        Button buttonBack3 = new Button("TILLBAKA");
        label5.setText("Fråga till " + namnSpelare1.getText() + ".");
        buttonBack3.setOnAction(e -> window.setScene(scene3));
        VBox layout5 = new VBox(20);
        layout5.setPadding(new Insets(30, 50, 100, 185)); //Tak, Höger Vägg, Golvet, Vänster Vägg


        //StackPane layout5 = new StackPane();
        layout5.getChildren().addAll(label5, label6, buttonBack3);
        scene4 = new Scene(layout5, 600, 300);
        window.setTitle("Quizera");
        window.show();


    }




        //Vad som händer efter programmet stängts ner.
        public void stop() throws Exception {
            System.out.println("After");



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



}

JavaFX 等 GUI 框架 event driven。 TextField 文本是动态的并且可以更改,生成一个您可以对其执行操作的事件。

当 TextField 文本更改时,更新 Label 文本以匹配新值。

您可以使用事件处理程序或绑定来执行此操作。

事件处理(属性改变监听器)解决方案

namnSpelare1.textProperty().addListener((observable, oldValue, newValue) ->
    label5.setText("Fråga till " + ((newValue != null) ? newValue : "") + ".")
);

绑定解决方案

Javafx concatenation of multiple StringProperty

label5.textProperty().bind(
   Bindings.concat(
       "Fråga till ", namnSpelare1.textProperty(), "."
   )
);

注意上面语句中的,用法而不是+,这很重要...


关于 properties and binding 的背景文档。