Java 使用按钮从一个类到另一个类获取TextField的值
我正在使用Vaadin从另一个类获取textfield的值 我的解决方案是这样的Java 使用按钮从一个类到另一个类获取TextField的值,java,vaadin,Java,Vaadin,我正在使用Vaadin从另一个类获取textfield的值 我的解决方案是这样的 public class MyTextField{ String str; public MyTextField(){ TextField text = new TextField(); str = text.getValue().toString(); } public String getStr(){ return str;
public class MyTextField{
String str;
public MyTextField(){
TextField text = new TextField();
str = text.getValue().toString();
}
public String getStr(){
return str;
}
}
public class MyButton{
public MyButton(){
Button button = new Button("UPDATE");
button.addListener(new Button.ClickListener(){
@Override
public void buttonClick(ClickEvent event) {
MyTextField text = new MyTextField();
System.out.println(text.getStr());
}
});
}
}
问题是,我总是得到空结果。非常感谢您的帮助。谢谢。buttonClick方法中的MyTextField对象很可能与显示给用户的MyTextField不同。一种解决方案是获取对保存显示的MyTextField的类的引用,然后对该引用调用公共方法以提取文本
编辑1
请注意,我不熟悉Vaadin,但是您的MyTextField类看起来很可疑,因为您正在声明构造函数中的文本字段,使其仅在构造函数中可见。我也不确定在任何事件发生之前,在用户有机会与组件交互之前,立即对其调用
getValue()
,会做什么。我觉得这很可疑
编辑2 例如,如果这是Swing,我会这样做:
public class MyTextField{
TextField textField = new TextField();
public MyTextField(){
}
// so it can be added to the gui
public TextField getTextField() {
return textField;
}
public String getStr(){
return textField.getValue().toString(); // not sure if this is correct
}
}
public class MyButton{
private MyTextField textField;
private Button button = new Button("UPDATE");
public MyButton(final MyTextField textField){
this.textField = textField;
button.addListener(new Button.ClickListener(){
@Override
public void buttonClick(ClickEvent event) {
System.out.println(textField.getStr());
}
});
}
}
编辑3
你问: 您已将“private MyTextField textfield”声明为字段,并从MyButton构造函数中添加了一个参数(MyTextField textfield)。这是否意味着我必须将类MyTextField作为引用传递给MyButton类 再次请注意,我不熟悉Vaadin,但我熟悉Java对象的一般用法,我知道这一点。如果希望一个类(此处为MyButton)获取另一个对象(此处为MyTextField)的状态,则第一个对象需要对第二个对象进行有效引用。获取此引用的一种方法是将其作为构造函数参数传入。另一种是通过setter方法,比如给MyButton一个
setMyTextField(TextField TextField)
方法,然后将引用分配给您的字段。另一种选择是通过“依赖注入”,但我认为这可能是有点太先进,但现在考虑它在未来。
如果你试着像在原始帖子中那样做,事情很可能会失败,因为确实,你给了MyButton一个MyTextField对象,但是这是什么?它是在MyButton类中创建的,在其他任何地方都不存在。buttonClick方法中的MyTextField对象很可能与显示给用户的MyTextField不同。一种解决方案是获取对保存显示的MyTextField的类的引用,然后对该引用调用公共方法以提取文本
编辑1
请注意,我不熟悉Vaadin,但是您的MyTextField类看起来很可疑,因为您正在声明构造函数中的文本字段,使其仅在构造函数中可见。我也不确定在任何事件发生之前,在用户有机会与组件交互之前,立即对其调用
getValue()
,会做什么。我觉得这很可疑
编辑2 例如,如果这是Swing,我会这样做:
public class MyTextField{
TextField textField = new TextField();
public MyTextField(){
}
// so it can be added to the gui
public TextField getTextField() {
return textField;
}
public String getStr(){
return textField.getValue().toString(); // not sure if this is correct
}
}
public class MyButton{
private MyTextField textField;
private Button button = new Button("UPDATE");
public MyButton(final MyTextField textField){
this.textField = textField;
button.addListener(new Button.ClickListener(){
@Override
public void buttonClick(ClickEvent event) {
System.out.println(textField.getStr());
}
});
}
}
编辑3
你问: 您已将“private MyTextField textfield”声明为字段,并从MyButton构造函数中添加了一个参数(MyTextField textfield)。这是否意味着我必须将类MyTextField作为引用传递给MyButton类 再次请注意,我不熟悉Vaadin,但我熟悉Java对象的一般用法,我知道这一点。如果希望一个类(此处为MyButton)获取另一个对象(此处为MyTextField)的状态,则第一个对象需要对第二个对象进行有效引用。获取此引用的一种方法是将其作为构造函数参数传入。另一种是通过setter方法,比如给MyButton一个
setMyTextField(TextField TextField)
方法,然后将引用分配给您的字段。另一种选择是通过“依赖注入”,但我认为这可能是有点太先进,但现在考虑它在未来。
如果你试着像在原始帖子中那样做,事情很可能会失败,因为确实,你给了MyButton一个MyTextField对象,但是这是什么?它是在MyButton类中创建的,在其他任何地方都不存在。我宁愿做这样的事情,来实现您正在做的事情。这是基于这样的假设,即您试图在单击按钮时读取用户输入的值。 实现这一目标有两种选择 选择1 选择2 请让我知道,如果这不是你所期望的 感谢装满鳗鱼的气垫船试图帮助他摆脱困境
谢谢。我宁愿做这样的事情,来实现你正在做的事情。这是基于这样的假设,即您试图在单击按钮时读取用户输入的值。 实现这一目标有两种选择 选择1 选择2 请让我知道,如果这不是你所期望的 感谢装满鳗鱼的气垫船试图帮助他摆脱困境
谢谢。@garagumo:真的很简单。您正在buttonClick内创建一个新的MyTextField。请理解此对象与任何其他MyTextField对象绝对没有关系。它无法神奇地获取显示的MyTextField对象所持有的文本。我不知道如何解释得更清楚。@LajosArpad:谢谢,但是如果你知道Vaadin,那么请给出一个答案。既然textfield被用作一个类变量,还需要从MyButton构造函数中输入一个参数(MyTextField textfield)吗?@garagumo:请澄清你的问题——我不确定你在问什么。例如,在您的
public class MyTextField extends TextField{
public MyTextField(){
}
public String getStr(){
return this.getValue();
}
}
public class MyButton extends Button{
public MyButton(final MyTextField text){
setCaption("UPDATE");
addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
System.out.println(text.getStr());
}
});
}
}
//And in your presentation logic
final MyTextField text = new MyTextField();
MyButton button = new MyButton(text);
mainLayout.addComponent(text);
mainLayout.addComponent(button);