如何将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
相关产品推荐
相关产品推荐

