我创建了一个文本字段:
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中的字符串保存到字符串变量中。我该怎么做?
答案 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();
// ..
});