提问者:小点点

JavaVaadin创建按钮的问题


这是使用Vaadin的经典例子


@Route("hello")
public class Dupa extends VerticalLayout {
public renderButtons() throws IOException, I2CFactory.UnsupportedBusNumberException {
  

        Button kitchen_button = new Button("Kitchen");
        Button bathrooom_button = new Button("bathroom");

     
        kitchen_button .addClickListener(click -> {
           //some actions...
        });

        add(kitchen_button );
        add(bathrooom_button );
    }
}

我的问题是从类外部访问kitchen_button。我尝试在类中添加静态字段。甚至尝试在其他类中创建此按钮并作为参数返回此处。

这个函数总是在有人打开页面时运行。所以如果你在Firefox或chrome上打开页面(转到特定的endpoint),它会运行该方法两次。这也造成了问题。我尝试了疯狂的解决方案,比如,创建此按钮后,将其添加到列表中,然后在列表中的每个元素上运行我的操作。这是非常愚蠢的解决方案,因为每次打开新页面后,此按钮都在创建。没有成功…

我想从另一个类使用该方法

public void changeColourButtonToRedOff(Button ob) {
    ob.addThemeVariants(ButtonVariant.LUMO_PRIMARY, ButtonVariant.LUMO_ERROR);
    ob.removeThemeVariants(ButtonVariant.LUMO_SUCCESS);
}

我尝试了很多事情正如我上面所说但它不工作

我尝试将其添加为静态,作为类中的字段。甚至尝试在其他类中创建此按钮并作为参数返回此处。


共1个答案

匿名用户

我发现通常最好将Vaadin小部件声明为布局上的成员字段,而不是本地。

public class Dupa extends VerticalLayout {

    \\ Member fields 
    public Button kitchen_button ;
    …

    public renderButtons() throws IOException, I2CFactory.UnsupportedBusNumberException {
       this.kitchen_button = new Button( "Kitchen" ) ;
        …
    }
…
}

要使该按钮随处可见,请将其标记为public。我并不建议让您的Vaadin小部件随处可见。

你说:

我的问题是从课外接触kitchen_button

从多个类访问您的Vaadin小部件可能表明设计不佳。通常最好让布局管理自己的小部件。其他类应该向布局发送消息,而不是直接操作布局的内容。

你说:

我试着把它加为静电

不,绝对不要这样做。您的每个用户都必须有自己的按钮实例。使用静态,您在整个JVM中只有一个实例,并且Vaadin不允许共享状态/组件。当尝试附加到另一个会话时,您将收到错误消息。