1

我试图在运行客户端(Web)的进程上弹出一个文件选择器。但是文件选择器窗口出现在服务器机器上。

这里我们只使用 JFileChooser...

JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Save Log File as"); 
chooser.setSelectedFile(new File("AttendenceBug.html"));

该工作基于使用 zk 框架的 adempiere erp。

4

1 回答 1

0
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Save Log File as"); 
chooser.setSelectedFile(new File("AttendenceBug.html"));

Adempiere中,用户可能使用 两种可能的客户端。

基于本地Swing的客户端在用户的 PC 上运行,在这种情况下,客户端 PC 几乎完成了会计和工作流之外的所有工作。这是90 年代最流行的传统Fat 客户端-服务器架构。

第二个,webUI,使用基于 Ajax的zk 框架。当用户使用此界面时,所有代码都在服务器上运行,而客户端(PC) 仅在 (web) UI 元素中进行处理。事实上,使用 zk 框架,服务器也处理大部分 UI,因此用户的 PC 仅呈现生成的 html。

您的示例代码中的JfileChooser是一个 Swing 组件,它对 Web(或服务器)一无所知,并且在运行时,正如您所体验的那样,它会在运行它的系统上打开选择 -在本例中为服务器

base Adempiere 中有一个文件选择器的示例。您可以在以下位置找到导入文件加载器

System Admin->Data->Data Import->Import File Loader

点击按钮标签

管理这个的代码在 zk webui 中是

org.adempiere.webui.apps.form.WfileImport.java

在其初始化方法jbInit()中,它创建了按钮

bFile.setLabel(Msg.getMsg(Env.getCtx(), "FileImportFile"));
bFile.setTooltiptext(Msg.getMsg(Env.getCtx(), "FileImportFileInfo"));
bFile.addEventListener(Events.ON_CLICK, this);

其中,当点击执行

        if (e.getTarget() == bFile)
        {
            cmd_loadFile();
            invalidate();
        }

the cmd_loadFile method is doing the work
private void cmd_loadFile()
    {
        Media media = null;

        try 
        {
            media = Fileupload.get();
        } 
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

        if (media == null)
            return;

        if (media.isBinary()) {
            m_file_istream = media.getStreamData();
        }
        else {
            ListItem listitem = fCharset.getSelectedItem();
            if (listitem == null) {
                m_file_istream = new ReaderInputStream(media.getReaderData());
            } else {
                Charset charset = (Charset)listitem.getValue();
                m_file_istream = new ReaderInputStream(media.getReaderData(), charset.name());
            }
        }

        log.config(media.getName());
        bFile.setLabel(media.getName());

        cmd_reloadFile();
    }

这使用 zk 框架组件Fileupload来实际打开您想要的文件选择对话框并选择要加载的文件。然后该方法的其余部分加载选定的文件。

从您的示例代码中,一旦选择了您要保存文件的文件,它就会出现。由于文件保存在服务器上,您真的想将文件上传到服务器!这只是上面的一个轻微变化,zk 网站提供了一些示例代码来实现这一点。

public class Upload {

    public static void saveToDisk() throws Exception {
        org.zkoss.util.media.Media media = Fileupload.get();

        File f=new File(media.getName());
        InputStream inputStream= media.getStreamData();
        OutputStream out=new FileOutputStream(f);
        byte buf[]=new byte[1024];
        int len;
        while((len=inputStream.read(buf))>0)
        out.write(buf,0,len);
        out.close();
        inputStream.close();

        String filepath = f.getAbsolutePath();
        mdbConverter mdb = new mdbConverter();

        Messagebox.show(filepath);
        }
}

资源

通过合并这两个示例,您应该能够为 Adempiere 创建一个新的增强功能来完成您的任务。

于 2015-10-09T16:44:05.907 回答