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

pdtvr36n  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(344)

我试图在运行客户端(web)的进程上弹出一个文件选择器。但是文件选择器窗口出现在服务器上。
这里我们只使用jfilechooser。。。

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

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

kzipqqlq

kzipqqlq1#

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

在adempiere中,用户可能使用两个可能的客户端。
基于swing的本地客户机运行在用户的pc上,在这种情况下,客户机pc几乎完成了会计和工作流之外的所有工作。这是90年代最流行的传统胖客户机-服务器体系结构。
第二个webui使用zk框架,而zk框架又基于ajax。当用户使用此界面时,所有代码都在服务器上运行,而客户端(pc)只处理(web)ui元素。事实上,使用zk框架,服务器也会处理大部分ui,因此用户的pc只呈现结果html。
示例代码中的jfilechooser是一个swing组件,它对web(或服务器)一无所知,当运行时,正如您所经历的那样,它会在运行它的系统(本例中是服务器)上打开选择。
在base adempiere中有一个文件选择器示例。导入文件加载程序,您可以在

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

单击按钮标签
zkwebui中管理这个的代码是

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创建一个新的增强来完成您的任务。

相关问题