Java 使用按钮从一个类到另一个类获取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;

我正在使用Vaadin从另一个类获取textfield的值

我的解决方案是这样的

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);