使用按钮将TextField的值从一个类获取到另一个类

时间:2014-05-03 12:40:04

标签: java vaadin

我正在尝试使用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结果。任何帮助都非常感谢。谢谢。

2 个答案:

答案 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)

我宁愿做这样的事情来实现你正在做的事情。这是基于您尝试在单击按钮时读取用户输入值的假设。 实现这一目标有两种选择。

选项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());
        }
    });

选项2

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

如果这不符合您的预期,请告诉我。

感谢充满鳗鱼的气垫试图帮助他

感谢。