java代码在客户端机器中弹出文件选择器

时间:2015-04-28 13:22:05

标签: java zk adempiere

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

这里我们只使用JFileChooser ......

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

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

1 个答案:

答案 0 :(得分:0)

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

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

基于本地 Swing 的客户端在用户的PC上运行,在这种情况下,客户端PC几乎完成了Accounting&流程。这是90年代最流行的传统胖客户端 - 服务器架构。

第二个是webUI,它使用 zk Framework ,后者又基于Ajax。当用户使用此界面时,所有代码都在服务器上运行,客户端(PC)仅在(Web)UI元素中处理。事实上,对于zk Framework,服务器也处理大部分UI,因此用户的PC只渲染生成的html。

示例代码中的 JfileChooser 是一个Swing组件,它对Web(或服务器)一无所知,运行时,如您所见,它会在运行它的系统上打开选择 - 在这种情况下是服务器

基础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 Framework组件 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);
        }
}

source

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