【问题标题】:Cannot access UI elements inside vaadin FileUpload FinishListener无法访问 vaadin FileUpload FinishListener 中的 UI 元素
【发布时间】:2016-01-11 22:28:00
【问题描述】:

我正在尝试提供在我的 vaadin 应用程序中上传文件的功能

protected Upload questionImageUpload = new Upload("Upload question", questionReceiver);

    questionImageUpload.addFinishedListener(new Upload.FinishedListener() {
        @Override
        public void uploadFinished(Upload.FinishedEvent event) {
            boolean hasLock = VaadinSession.getCurrent().hasLock();
            button.setEnabled(false);
        }
    });

但是,在我的FinishListener.uploadFinished() 中,如果我修改了一些 UI 元素(在上面,我禁用了一个按钮),则不会应用修改。

我假设这个方法可以在非 UI 线程中调用,所以我通过在上面的 uploadFinished 中放置断点来检查 VaadinSession 是否可用。但是,VaadinSession.getCurrent() 没有返回 null。 hasLock 也是如此。

可能是什么原因?

我在 Google App Engine 上运行这个 vaadin 应用程序(仍然在 IntelliJ IDEA 中本地运行)。这可能是这背后的原因吗?

【问题讨论】:

    标签: java google-app-engine file-upload vaadin


    【解决方案1】:

    文件上传是作为对服务器的 POST 请求完成的,其中包含文件数据。上传完成后,在该 POST 请求结束时调用 Upload.FinishedListeners。虽然所有线程本地设置都正确,但这不是 UI 更新请求(或 UIDL 请求),并且发送到浏览器的响应仅包含通知浏览器上传完成的文本。任何完成的 UI 更新都将排队,直到另一个请求提出要求。

    因此,你需要要么使用@Push,让UI变化通过推送通道立即推送到客户端,要么最晚在开始上传的时候启用轮询,这样轮询请求就会接起来用户界面发生变化。

    【讨论】:

    • 我也想过这个。如果是这种情况,我希望在向服务器发出其他浏览器请求后 UI 会得到更新,所以我点击了一些按钮。尽管如此,在上传完成处理程序中所做的更改并没有得到反映。 (我尝试启用推送,但我从 appengine 得到了很多错误)
    【解决方案2】:

    我实际上用 SuccedListener 完成了你想要做的事情。我有一个代码可以更新带有上传图片的嵌入式组件。您可以查看代码并从中获得启发。它还可以禁用按钮。您可以更正它未优化但它可以工作

    public class PicUploader 扩展 Upload 实现 SucceededListener、Receiver {

    private static final long serialVersionUID = 1L;
    File file;
    
    public String fileName;
    final String LOCATION = "/home/###";
    
    Embedded image = new Embedded();
    TextField field;
    
    public PicUploader(Embedded image, String caption) {
        this.image = image;
        this.addSucceededListener(this);
        this.setReceiver(this);
        this.setCaption(caption);
    
        this.setIcon(FontAwesome.UPLOAD);;
    
    }
    
    public PicUploader(Embedded image, TextField field) {
        this.image = image;
        this.addSucceededListener(this);
        this.setReceiver(this);
        this.field = field;
        this.setButtonCaption(""+FontAwesome.UPLOAD);
        this.setIcon(FontAwesome.UPLOAD);;
    
    }
    
    @Override
    public OutputStream receiveUpload(String filename, String mimeType) {
        // TODO Auto-generated method stub
        FileOutputStream stream = null;
    
        try {
            file = new File(LOCATION
                    + "/Pictures/"
                    + System.currentTimeMillis()
                    + filename.substring(filename.length() - 4,
                            filename.length()));
            fileName = file.getName();
            System.out.println("This is the file name " + filename);
            stream = new FileOutputStream(file);
        } catch (FileNotFoundException ex) {
    
            ex.printStackTrace();
        }
    
        return stream;
    }
    
    @Override
    public void uploadSucceeded(SucceededEvent event) {
        // TODO Auto-generated method stub
        image.setSource(new FileResource(file));
        image.setVisible(true);
        image.setWidth("150");
        image.setHeight("200");
        // float ratio = image.getHeight()/image.getWidth();
        // image.setWidth(""+image.getWidth());
        // image.setHeight(""+image.getHeight());
        // field.setValue(getFileName());
        this.setEnabled(false);
    }
    
    public String getFileName() {
        return fileName;
    }
    

    }

    【讨论】:

    • 您的代码可能有效,但在我的情况下,如果我禁用 SucceedListener 或 CompleteListener 中的按钮,按钮不会被禁用。我发布了寻找原因的问题
    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2016-05-03
    • 2012-09-09
    相关资源
    最近更新 更多