Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:我需要用一个按钮从文本字段中获取信息_Java_Javafx - Fatal编程技术网

JavaFX:我需要用一个按钮从文本字段中获取信息

JavaFX:我需要用一个按钮从文本字段中获取信息,java,javafx,Java,Javafx,我已经创建了一个文本字段: TextField tfPost = new TextField("140 character word count..."); 我还有一个带有ActionEvent处理程序类的按钮: Button btTweet = new Button("Tweet"); TweetHandlerClass btTweetHandler = new TweetHandlerClass(); btTweet.setOnAction(btTweetHandler); class

我已经创建了一个文本字段:

TextField tfPost = new TextField("140 character word count...");
我还有一个带有ActionEvent处理程序类的按钮:

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();
    }
}
以下是处理程序类的主体:

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();
    }
}
类TweetHandlerClass实现EventHandler{
@凌驾
公共无效句柄(ActionEvent ae){
System.out.println(“点击了Tweet按钮”);
字符串newTweet=tfPost.getText();
}
}

我需要的是,单击Tweet按钮时,将TextField中的字符串保存到字符串变量中。如何做到这一点?

变量范围界定是一个设计问题。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();
  }
}

如果您真的希望事件处理程序是这样的顶级类,那么可以像@KevinO的回答中那样为它提供一个对
TextField
的引用。在这一点上有一个小小的变化,就是引用一个
供应商
,这在语义上是您真正需要的:

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();
    }
}
不过,这简直是矫枉过正。通常,您只需使用lambda表达式定义事件处理程序,而不是显式类:

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

“保存到字符串变量”是什么意思?
String newTweet
不是按下按钮时创建的字符串变量吗?哦,是的,对不起。出于某种原因,这是行不通的。它说,找不到符号“tfPost”,请确保
TextField tfPost
是类的实例变量(最好是final)。如果它说找不到符号,说明你的作用域有问题。它仍然不起作用事件处理程序是内部类还是顶级类?它会起作用,但在任何大小合理的应用程序中,此策略将创建比您合理处理的代码和源文件多得多的代码和源文件。。。