我对源进行了一些更改(仍是基本的,但它可以让你开始):
- 只有1个公共共享状态
switch value change listeners
现在只是触发state changed event
state changed listeners
现在更新UI元素触发
- UPO时Ñ注册,
state changed listeners
是有关当前状态
的主要思想是具有只是一个单一的共享状态的任何变化被传递到所有侦听(包括一个其中所述变化起源)通知(触发)。
以下您可以找到代码:(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)结果
对我来说这是一个有点不清楚你想要做什么seing代码和阅读后说明:** 1)**在UI中共享一个灯泡/开关状态,并且在UI中打开/关闭更新剩余的状态? ** 2 **)每个用户界面都有一个灯泡/开关...?我假设它是** 1)**,所以你应该只有一个静态开关状态(不是列表)和一个监听器列表。一旦状态改变,将新状态广播给所有的监听者,这样他们相应的UI就会被更新。 – Morfic
您好@Morfic非常感谢您的帮助,是1),当我更改影响其他用户界面的开关,并且实际上只是在做这个部分时,我的问题是,当我刷新浏览器时,开关状态不会保留,我已经尝试了几件事,但我感到困惑:s,也就是说,如果我的开关打开,我应该继续刷新选项卡,我不想使用PreserveOnRefresh:s,作为Markus的示例代码,我尝试使用它作为我的交换机的指南,并保持其状态,因为他们在他们的例子中甚至刷新浏览器 –