JavaFX:我需要从带有Button的TextField获取信息

时间:2016-04-11 21:59:22

标签: java javafx

我创建了一个文本字段:

TextField tfPost = new TextField("140 character word count...");

我还有一个带有ActionEvent Handler类的按钮:

Button btTweet = new Button("Tweet");
TweetHandlerClass btTweetHandler = new TweetHandlerClass();
btTweet.setOnAction(btTweetHandler);

这是处理程序类的主体:

class TweetHandlerClass implements EventHandler<ActionEvent> {
    @Override
    public void handle(ActionEvent ae) {
        System.out.println("Tweet button was clicked");
        String newTweet = tfPost.getText();
    }
}

单击Tweet按钮时,我需要将TextField中的字符串保存到字符串变量中。我该怎么做?

2 个答案:

答案 0 :(得分:0)

变量范围是一个设计问题。 OP的问题没有提供足够的信息来理解完整的用例。一种方法是将变量存储在TweetHandlerClass中。这种方法有各种各样的理由支持和反对。尽管如此,对于提出的具体问题,它应该足够了。

class TweetHandlerClass implements EventHandler<ActionEvent> {
  private final TextField tfPost;

  public TweetHandlerClass(TextField srcTxtFld)
  {
     this.tfPost = srcTxtFld;
  }
  @Override
  public void handle(ActionEvent ae) {
    System.out.println("Tweet button was clicked");
    String newTweet = tfPost.getText();
  }
}

然后,在实例化Button:

TextField tfPost = new TextField("140 character word count...");

Button btTweet = new Button("Tweet");
TweetHandlerClass btTweetHandler = new TweetHandlerClass(tfPost);
btTweet.setOnAction(btTweetHandler);

答案 1 :(得分:0)

如果你真的希望事件处理程序是这样的顶级类,你可以像@ KevinO的答案那样给它一个TextField的引用。稍微改变一下就是引用Supplier<String>,这在语义上更符合你的需要:

class TweetHandlerClass implements EventHandler<ActionEvent> {

    private final Supplier<String> tweetSupplier ;

    TweetHandlerClass(Supplier<String> tweetSupplier) {
        this.tweetSupplier = tweetSupplier ;
    }

    @Override
    public void handle(ActionEvent ae) {
        System.out.println("Tweet button was clicked");
        String newTweet = tweetSupplier.get();
    }
}

然后

Button btTweet = new Button("Tweet");
TweetHandlerClass btTweetHandler = new TweetHandlerClass(tfPost::getText);
btTweet.setOnAction(btTweetHandler);

这实在是太过分了。通常,您只需使用lambda表达式而不是显式类来定义事件处理程序:

Button btTweet = new Button("Tweet");
btTweet.setOnAction(e -> {
    System.out.println("Tweet button was clicked");
    String newTweet = tfPost.getText();
    // ..
});