【问题标题】:Javafx Textfield to set name of object [duplicate]Javafx文本字段设置对象的名称[重复]
【发布时间】:2018-12-08 06:29:48
【问题描述】:

学习 JavaFX,我有两个文本字段,用户可以在其中输入两个玩家姓名,我想存储它们以供程序(它是一个游戏)使用,并在其他类中使用名称,包括 maingame 类。如果我在welcomecontroller 中打印,它会在您单击提交时打印输入的值,但是,在任何其他类中,如果我执行p1.getName();它返回“null”

我已经创建了一个带有 setter 和 getter 的播放器类来设置对象的名称,我包含以下代码!任何帮助将不胜感激!

欢迎控制器

@FXML
private Button btn_start;

@FXML
public void pressButton(ActionEvent event){
    //Create and Set Player1 Name
    player p1 = new player();
    p1.setName(field_player1.getText());
    //Create and Set Player2 Name
    player p2 = new player();
    p2.setName(field_player2.getText());
    try {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("main.fxml"));
            Parent root = (Parent) fxmlLoader.load();
            Stage stage = new Stage();
            stage.setScene(new Scene(root));  
            stage.show();
    } catch(Exception e) {
       e.printStackTrace();
      }
 }

player.java

public class player {
    public String Name;

    public void Player(String Name) {
        this.Name = Name;
    }

    public String Name() {
        return Name;
    }

    public void setName(String Name) {
        this.Name = Name;
    }

    public String getName() {
        return this.Name;   
    }
}

所以在除了欢迎控制器之外的任何其他类中,每当我执行 p1.getName();它返回 null

如果我在欢迎控制器中执行 p1.getName();它将返回在 textfield1 中输入的任何内容。

提前致谢!

【问题讨论】:

  • 如果任何其他类需要使用对象 p1 (p1.getName();) 中的信息,则需要获取对 p1 的引用。贴出的代码不是minimal reproducible example,也没有重现你问的问题。
  • 因此,例如,如果我在这两个旁边创建另一个类,让我们说“example.java”,然后执行“System.out.println(p1.getName());”,据我所知它应该获取我们在欢迎控制器类中设置“P1”的名称的任何值,但是,它返回的不是这个值。

标签: java javafx fxml


【解决方案1】:

对于使用Player 对象p1 的任何其他类,它需要获取对它的引用。
如果您想在Example.java 中使用p1,正如您所要求的,您需要将p1 的引用传递给它。您可以通过多种方式做到这一点,构造函数就是其中之一:

 new Example(p1);

Seter 将是另一个

 Example ex = new Example();
 ex.setPlayer(p1); 

要演示在您的用例中传递引用,请使用

main.fxml

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

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.StackPane?>

<StackPane xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" 
                                                            fx:controller="src.tests.xml.MainController">
   <children>
      <Label fx:id="nameLabel" text="Label" />
   </children>
</StackPane>

MainController.java

import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class MainController {

    @FXML
    Label nameLabel;

    void setPlayerName(String name){
        nameLabel.setText(name);
    }
}

并编辑pressButton:

@FXML
private Button btn_start;
@FXML
private TextField field_player;

@FXML
public void pressButton(ActionEvent event){

    Player p1 = new Player();
    p1.setName(field_player.getText());

    try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("main.fxml"));
            Parent root = (Parent) fxmlLoader.load();
            MainController mainController = (MainController)fxmlLoader.getController();
            mainController.setPlayerName(p1.getName()); //pass a reference of name to the other controller 
            Stage stage = new Stage();
            stage.setScene(new Scene(root));
            stage.show();
    } catch(Exception e) {
       e.printStackTrace();
    }
 }

【讨论】:

  • 嗨!感谢您提供信息丰富的帖子,非常感谢!我创建了 Example.java 只是为了测试,当我尝试前两种方法时,我得到一个错误,只是告诉我创建一个“p1”的局部变量/字段,如果我尝试任何一个然后运行它仍然返回“null” ,
  • 第二种方法确实有效,我可以看到变量然后显示在另一个控制器中,但是,我如何在其他类中使用“p1”,例如如果我想要 System.out。 println(p1) 在另一个类中,让我们再说一下 Example.java,并显示输入的名称?
  • 对不起,我无法回答。我不知道the first two methods 或“其他控制器. For questions about Example”是什么意思,请发一个新帖子并包含 mcve。对于原始问题,请使用我发布的代码。
猜你喜欢
  • 2018-04-28
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2016-07-18
相关资源
最近更新 更多