You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将JFileChooser选中文件传递给JButton执行XMI转换并实现输出下载

实现方案

核心逻辑为通过GUI类的成员变量中转跨按钮的共享数据,按以下步骤修改代码即可完成所有需求:


第一步:给GUI类新增共享成员变量

在你的GUI类的属性定义区域添加以下两个变量,用于中转选中的输入文件路径、统一输出文件路径:

import javax.swing.JOptionPane; // 若未导入该类请先添加

// 存储Load file按钮选中的输入XMI文件绝对路径
private String selectedInputXmiPath;
// 固定转换输出文件的临时存储路径,和你现有launch方法的输出路径保持一致即可
private static final String TEMP_OUTPUT_XMI_PATH = "./mo/resultXMI.xmi";

第二步:修改Load file按钮监听器

选中文件后将路径赋值给共享变量,同时补充用户取消选择文件的空判逻辑,避免空指针异常:

loader.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
        JFileChooser chooser = new JFileChooser();
        int option = chooser.showOpenDialog(null);
        // 仅当用户确认选择文件时执行后续逻辑
        if (option == JFileChooser.APPROVE_OPTION) {
            File f = chooser.getSelectedFile();
            // 将选中的文件路径赋值给共享变量
            selectedInputXmiPath = f.getAbsolutePath();
            try {
                FileReader reader = new FileReader(selectedInputXmiPath);
                BufferedReader br = new BufferedReader(reader);
                // 你原来的逻辑是把内容放到textArea/input文本框,保留即可
                textArea.read(br, null);
                br.close();
                textArea.requestFocus();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
});

第三步:修改Transform按钮监听器

替换硬编码的输入文件路径为共享变量值,转换完成后读取输出文件内容写入output文本框:

transformer.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // 先判断是否已选择输入文件
        if (selectedInputXmiPath == null || selectedInputXmiPath.isBlank()) {
            JOptionPane.showMessageDialog(null, "请先通过Load file选择输入XMI文件");
            return;
        }
        try {
            ATLLauncher atlLaunch = new ATLLauncher();
            atlLaunch.registerInputMetamodel("./mm/input.ecore");
            atlLaunch.registerOutputMetamodel("./mm/output.ecore");
            // 把原来硬编码的第二个参数(输入文件路径)替换为共享变量
            atlLaunch.launch(
                "./mm/input.ecore", 
                selectedInputXmiPath, 
                "./mm/output.ecore", 
                TEMP_OUTPUT_XMI_PATH, 
                "./transformation/",
                "MyTrans"
            );  
            // 转换完成后读取输出文件内容,写入output文本框
            BufferedReader br = new BufferedReader(new FileReader(TEMP_OUTPUT_XMI_PATH));
            output.read(br, null); // 若你的输出文本框命名为outputfile请替换为对应名称
            br.close();
            System.out.println("done!!");
        } catch (Exception e1) {
            e1.printStackTrace();
            JOptionPane.showMessageDialog(null, "转换失败:" + e1.getMessage());
            System.out.println("nope");
        }
    }
});

第四步:优化Download按钮监听器

补充空判逻辑,避免无转换结果、用户取消保存时触发空指针异常:

downloader.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // 先判断是否有转换后的输出内容
        if (output.getText().isBlank()) { // 若你的输出文本框命名为outputfile请替换为对应名称
            JOptionPane.showMessageDialog(null, "暂无转换结果可下载");
            return;
        }
        JFileChooser chooser1 = new JFileChooser();
        int option = chooser1.showSaveDialog(null);
        if (option == JFileChooser.APPROVE_OPTION) {
            File f1 = chooser1.getSelectedFile();
            try {
                FileWriter fw = new FileWriter(f1);
                fw.write(output.getText()); // 若你的输出文本框命名为outputfile请替换为对应名称
                fw.close();
                JOptionPane.showMessageDialog(null, "文件保存成功");
            } catch (IOException e1) {
                e1.printStackTrace();
                JOptionPane.showMessageDialog(null, "保存失败:" + e1.getMessage());
            }
        }
    }
});

内容的提问来源于stack exchange,提问作者narine narine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:09:03