我正在尝试使用Vaadin从另一个类中获取文本字段的值。
我的解决方案是这样的。
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());
}
});
}
}
问题是,我总是得到null结果。任何帮助都非常感谢。谢谢。
答案 0 :(得分:4)
很可能,buttonClick方法中的MyTextField对象与向用户显示的MyTextField不同。解决方案是获取对包含显示的MyTextField的类的引用,然后在该引用上调用公共方法以提取文本。
编辑1
请注意,我不熟悉Vaadin,但您的MyTextField类看起来很可疑,因为您声明构造函数内的 ,使其可见 < / strong>在构造函数中。我也不确定在用户有机会与组件交互之前,在任何事件之前立即调用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文本字段)。这是否意味着我必须将MyTextField类作为参考传递给MyButton类?
再次注意,我不熟悉Vaadin,但我熟悉Java对象的一般用法,我知道。如果你想让一个类(这里是MyButton)得到另一个对象的状态(这里是MyTextField),那么第一个对象需要有效引用到第二个对象。获取此引用的一种方法是将其作为构造函数参数传递。另一个是通过setter方法,比如给MyButton一个setMyTextField(TextField textField)
方法,然后为你的字段分配引用。另一种选择是通过“依赖注入”,但我认为现在这可能有点过于先进,但将来会考虑它。
如果您尝试在原始帖子中执行此操作,事情可能会失败,因为当然,您给MyButton一个MyTextField对象,但是什么 MyTextField对象是这个?它是在MyButton类中创建的,并且不存在于其他地方。
答案 1 :(得分:1)
我宁愿做这样的事情来实现你正在做的事情。这是基于您尝试在单击按钮时读取用户输入值的假设。 实现这一目标有两种选择。
public class MyTextField extends TextField{
public MyTextField(){
}
public String getStr(){
return this.getValue();
}
}
public class MyButton extends Button{
public MyButton(){
setCaption("UPDATE");
}
}
//Add in your presentation logic
final MyTextField text = new MyTextField();
MyButton button = new MyButton();
mainLayout.addComponent(text);
mainLayout.addComponent(button);
button.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
System.out.println(text.getStr());
}
});
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);
如果这不符合您的预期,请告诉我。
感谢充满鳗鱼的气垫试图帮助他
感谢。