gpt4 book ai didi

java - Vaadin 操作一些小部件的几个基本问​​题

转载 作者:太空宇宙 更新时间:2023-11-04 10:36:00 25 4
gpt4 key购买 nike

我是 Vaadin 的新手。我正在尝试操作以下小部件。

private VerticalLayout layout;
ProgressBar bar = new ProgressBar(0.0f);
Button downLoadButton;

private void setupLayout() {
layout = new VerticalLayout();
layout.setDefaultComponentAlignment(Alignment.MIDDLE_CENTER);
setContent(layout);
}

private void setStockDownloadUI() {
TextField tf = new TextField("Downloading");
tf.setValue("Downloading stock data. It takes about 15 seconds.");
tf.setWidth("400");
tf.setVisible(false);
layout.addComponent(tf);
bar.setHeight("100");
bar.setWidth("500");
bar.setIndeterminate(true);
bar.setVisible(false);
layout.addComponent(bar);
Page.getCurrent().reload();
downLoadButton = new Button("Start download", click -> {
tf.setVisible(true);
bar.setVisible(true);
float current = bar.getValue();
if (current < 1.0f)
bar.setValue(current + 0.10f);
stockService.downloadStockContent();
startTimer();
Notification.show("Downloading",
"Stock data downloading. Please wait.",
Notification.Type.TRAY_NOTIFICATION);
});
downLoadButton.addStyleName("huge");
layout.addComponent(downLoadButton);
}


void checkDownloadStatus() {
stockElements = callBack.getDownloadedStock();
if (stockElements != null && stockElements.size() != 0) {
MessageBox
.createInfo()
.withCaption("Example 1")
.withMessage("Hello World!")
.withOkButton()
.open();
bar.setVisible(false);

layout.removeAllComponents();
timer.shutdownNow();
for (StockElement element : stockElements) {
System.out.println(element.toString());
}
}
}

有几个问题。我正在从网上下载一些内容。首先,我通过 setStockDownloadUI() 设置 UI。我在其中设置了进度条。下载完成后,我调用 checkDownloadStatus()。我想隐藏进度条。另外,当单击下载按钮一次时,我想禁用它。这样就不会被点击两次。

在 checkDownloadStatus() 中,我创建了一个从未在浏览器中显示的消息框。另外,我调用了layout.removeAllComponents();我尝试在下载完成后删除所有内容。但没有效果。

问题:

  1. 如何在单击一次按钮后禁用该按钮?
  2. 下载完成后如何从 VerticalLayout 中删除进度条甚至所有组件?
  3. 如何显示消息框?

更新

我发现如果我从另一个按钮单击调用方法:

workaroundButton = new Button("Work around", click -> {
this.bar.setVisible(false);
this.layout.removeComponent(bar);
this.layout.removeComponent(downLoadButton);
this.layout.removeComponent(textField);
layout.removeAllComponents();
});

然后就可以了。但如果我只是从我自己的回调方法中调用这些方法,这是行不通的。但这是 Not Acceptable 。我相信我的代码中遗漏了一些东西。

更新2

回答后,我尝试了以下代码。即使我通过调试器设置断点,它也永远不会到达 bp。所以代码从未被执行过。我错过了什么吗?我正在尝试通过计时器检查下载状态。

 @Push
@Theme("mytheme")
public class StockApplication extends UI {
// code removed.
}


private void startTimer() {
ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor();
timer.scheduleWithFixedDelay(new Runnable() {
public void run() {
UI.getCurrent().access((() -> {
// breakpoint never hit this book of code
MessageBox
.createInfo()
.withCaption("Wait")
.withMessage("Still downloading stock contents. Please check again after a while")
.withOkButton(() -> System.out.println("Ok pressed."))
.open();
checkDownloadStatus();}));

}
}, 1, 1, TimeUnit.SECONDS);
}

出了什么问题?请让我知道如何修复它?

我可以使用以下代码修复它:-

private void startTimer() {
UI ui = UI.getCurrent();
timer.scheduleWithFixedDelay(new Runnable() {
public void run() {
ui.access((() -> {
checkDownloadStatus();}));
}
}, 1, 1, TimeUnit.SECONDS);
}

所有的功劳都归于通过他/她的宝贵信息给我提示的人。

最佳答案

  1. 第一个问题很简单 - downLoadButton.setDisableOnClick(true)

2+3。我们正在谈论Vaadin Push这里。正如您所注意到的,默认情况下,只有浏览器触发了更改(例如,单击上面的 workaroundButton),Vaadin 组件的更新才会返回到浏览器。要将未经请求的更新发送回浏览器,您需要启用推送,它在幕后使用 Websocket 来允许浏览器继续接收更新。

上面的链接解释了如何为您的 UI 启用推送。

一旦启用推送,它就非常流畅 - 您可以像平常一样操作小部件,并且更改仍然会返回到浏览器。您只需要记住将这些更新包装在 UI.access() 中即可确保您拥有 session 锁。例如。 :

ui.access(() -> checkDownloadStatus());

ui 只是您的 UI 类,或者您可以使用 widget.getUI() 从任何小部件获取它。

关于java - Vaadin 操作一些小部件的几个基本问​​题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49474234/

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