gpt4 book ai didi

java - 通过 Push、vaadin 切换附加组件

转载 作者:行者123 更新时间:2023-12-02 12:58:50 25 4
gpt4 key购买 nike

我有一个使用vaadin的附加开关的简单示例,我想要的是即使在更新UI时也保持开关的状态,即我支持多个选项卡,但我做不到,这个推送示例与我想要做的非常相似,但使用了 textField

https://github.com/vaadin-marcus/push-example/blob/master/src/main/java/com/vaadin/training/ScrumBoardLayout.java

https://github.com/rucko24/MVP/blob/testingSwitchPushTemu/src/main/java/com/Core/vaadin/pushServer/ejemploPushMarkus/ScrumBoard.java

在我的示例中,我添加了一个灯泡,以便当另一个人访问该应用程序时可以看到灯泡的当前状态。我在 github 中的示例是这样的,只有 3 个类

https://github.com/rucko24/MVP/tree/testingSwitchPushTemu/src/main/java/com/Core/vaadin/pushServer/ejemploPushMarkus

bombilla

这是改变我的灯泡的 swithc 监听器,但是当我获得 boolean 值(true 或 false)时,我仍然不明白插入另一个开关的正确方法

switchTemu.addValueChangeListener(new Property.ValueChangeListener() {
private static final long serialVersionUID = 1L;

@Override
public void valueChange(Property.ValueChangeEvent event) {
boolean estado = (boolean) event.getProperty().getValue();
ScrumBoard.addSwitch(estado);
switchTemu.removeValueChangeListener(this);
if(estado == Boolean.TRUE) {
bombilla.setIcon(bombillaON);

}else {
bombilla.setIcon(bombillaOFF);

}
switchTemu.addValueChangeListener(this);

}
});

更新

在我的github成就示例中,将所有开关的状态更改为所有UI,但我仍然不知道如何获取开关的状态

最佳答案

我对您的来源做了一些更改(仍然是基本的,但它可以帮助您入门):

  • 只有 1 个公共(public)共享状态
  • 切换值更改监听器现在只需触发状态更改事件
  • 状态更改监听器现在会在触发时更新 UI 元素
  • 注册后,状态更改监听器会收到有关当前状态的通知(触发)

主要思想是只有一个共享状态,任何更改都会传达给所有监听器(包括发生更改的监听器)。

下面你可以找到代码:(P.S.我没有重新编译我的小部件集,所以漂亮的开关图标回落到默认的复选框样式)

1) SwitchState - 表示所有应用实例之间共享的开关状态

public enum SwitchState {
ON(true, new ThemeResource("img/on.png")), OFF(false, new ThemeResource("img/off.png"));

private final boolean value;
private final ThemeResource icon;

SwitchState(boolean value, ThemeResource icon) {
this.value = value;
this.icon = icon;
}

public boolean getValue() {
return value;
}

public ThemeResource getIcon() {
return icon;
}

public static SwitchState from(boolean value) {
return value ? ON : OFF;
}
}

2) ScrumBoard 通用状态和监听器管理器

public class ScrumBoard {

// list of listeners
private static List<SwitchChangeListener> LISTENERS = new ArrayList<>();
// initial state
private static SwitchState STATE = SwitchState.OFF;

// state change listener contract
public interface SwitchChangeListener {
void handleStateChange(SwitchState state);
}

// handle a a state change request
public static synchronized void updateState(boolean value) {
STATE = SwitchState.from(value);
fireChangeEvent(STATE);
}

// register a new state listener
public static synchronized void addSwitchChangeListener(SwitchChangeListener listener) {
System.out.println("Added listener for " + listener);
LISTENERS.add(listener);
// when a new listener is registered, also inform it of the current state
listener.handleStateChange(STATE);
}

// remove a state listener
public static synchronized void removeSwitchListener(SwitchChangeListener listener) {
LISTENERS.remove(listener);
}

// fire a change event to all registered listeners
private static void fireChangeEvent(SwitchState state) {
for (SwitchChangeListener listener : LISTENERS) {
listener.handleStateChange(state);
}
}
}

3) ScrumBoardLayout - UI 布局和组件

public class ScrumBoardLayout extends VerticalLayout implements ScrumBoard.SwitchChangeListener {

private Label icon = new Label();
private Switch mySwitch = new Switch();

public ScrumBoardLayout() {
setMargin(true);
setSpacing(true);
addHeader();

// listen for state changes
ScrumBoard.addSwitchChangeListener(this);
}

private void addHeader() {
mySwitch.setImmediate(true);
icon.setSizeUndefined();

// notify of state change
mySwitch.addValueChangeListener((Property.ValueChangeListener) event -> ScrumBoard.updateState((Boolean) event.getProperty().getValue()));

VerticalLayout layout = new VerticalLayout();
layout.setHeight("78%");
layout.addComponents(icon, mySwitch);

layout.setComponentAlignment(icon, Alignment.BOTTOM_CENTER);
layout.setComponentAlignment(mySwitch, Alignment.BOTTOM_CENTER);
layout.setExpandRatio(mySwitch, 1);
addComponents(layout);
}

@Override
public void handleStateChange(SwitchState state) {
// update UI on state change
UI.getCurrent().access(() -> {
mySwitch.setValue(state.getValue());
icon.setIcon(state.getIcon());
Notification.show(state.name(), Type.ASSISTIVE_NOTIFICATION);
});
}

@Override
public void detach() {
super.detach();
ScrumBoard.removeSwitchListener(this);
}
}

4) 结果 Light bulbs

关于java - 通过 Push、vaadin 切换附加组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44358832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com