java 允许用户定义要编辑的XML文件的文件路径

rpppsulh  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(104)

最近我一直在转换一个python脚本,我制作了它来编辑在游戏中用作关卡的XML文件,到java,我发现了一个问题。我想让用户设置要编辑的XML文件的路径,因为有很多他们可能想要编辑的文件,但是我的代码工作的方式我不知道该怎么做
我已经把我的全部代码下面

import javax.swing.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.awt.*;
import java.io.File;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class mapEdit {

    public static void main(String[] args) {
        try {
            String filePath = "B:/SteamLibrary/steamapps/common/Tasty Planet/assets/levels/bacteria.xml";
            File file = new File(filePath);

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(file);
            Element root = doc.getDocumentElement();

            JFrame frame = new JFrame("Map Size Editor");

            JPanel heightPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
            heightPanel.add(new JLabel("Rows of tiles to add (height)"));
            heightPanel.add(new JTextField(10));

            JPanel widthPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
            widthPanel.add(new JLabel("Rows of tiles to add (width)"));
            widthPanel.add(new JTextField(10));

            JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
            JButton setSizeButton = new JButton("Set Size");

            setSizeButton.addActionListener(e -> {
                System.out.println("you entered " + ((JTextField) heightPanel.getComponent(1)).getText());
                float height = Float.parseFloat(root.getAttribute("height"))
                        + (Integer.parseInt(((JTextField) heightPanel.getComponent(1)).getText()) * 256);
                float width = Float.parseFloat(root.getAttribute("width"))
                        + (Integer.parseInt(((JTextField) widthPanel.getComponent(1)).getText()) * 256);
                System.out.println("height was: " + root.getAttribute("height"));
                root.setAttribute("height", String.valueOf(height));
                System.out.println("height is: " + root.getAttribute("height"));

                System.out.println("width was: " + root.getAttribute("width"));
                root.setAttribute("width", String.valueOf(width));
                System.out.println("width is: " + root.getAttribute("width"));

                try {
                    TransformerFactory transformerFactory = TransformerFactory.newInstance();
                    Transformer transformer = transformerFactory.newTransformer();
                    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                    DOMSource source = new DOMSource(doc);
                    StreamResult result = new StreamResult(file);
                    transformer.transform(source, result);
                    JOptionPane.showMessageDialog(frame, "Changes were successful.");
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            });
            buttonPanel.add(setSizeButton);

            JPanel contentPanel = new JPanel();
            contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
            contentPanel.add(heightPanel);
            contentPanel.add(widthPanel);
            contentPanel.add(buttonPanel);

            frame.setContentPane(contentPanel);
            frame.setMinimumSize(new Dimension(400, 200));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

我曾尝试向GUI添加按钮和文本输入,并使用它们设置filePath变量,但没有成功

cbjzeqam

cbjzeqam1#

import org.w3c.dom.Document;
        import org.w3c.dom.Element;
        
        import javax.swing.*;
        import javax.swing.filechooser.FileNameExtensionFilter;
        import javax.xml.parsers.DocumentBuilder;
        import javax.xml.parsers.DocumentBuilderFactory;
        import javax.xml.transform.OutputKeys;
        import javax.xml.transform.Transformer;
        import javax.xml.transform.TransformerFactory;
        import javax.xml.transform.dom.DOMSource;
        import javax.xml.transform.stream.StreamResult;
        import java.awt.*;
        import java.io.File;
        
        public class XMLFileReader {
        
                public void buildGui() {
                    JPanel contentPanel = new JPanel();
                    try {
                        // Open file chooser dialog
                        JFileChooser fileChooser = new JFileChooser();
                        fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
                        //File filter
                        FileNameExtensionFilter filter = new FileNameExtensionFilter("XML files", "xml");
                        fileChooser.setFileFilter(filter);
        
        
                        int result = fileChooser.showOpenDialog(contentPanel);
                        if (result != JFileChooser.APPROVE_OPTION) {
                            JOptionPane.showMessageDialog(contentPanel, "Something is went wrong, sorry");
                            return;
                        }
                        File selectedFile = fileChooser.getSelectedFile();
        
                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                        DocumentBuilder db = dbf.newDocumentBuilder();
                        Document doc = db.parse(selectedFile);
                        Element root = doc.getDocumentElement();
        
        
                        JPanel heightPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
                        heightPanel.add(new JLabel("Rows of tiles to add (height)"));
                        heightPanel.add(new JTextField(10));
        
                        JPanel widthPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
                        widthPanel.add(new JLabel("Rows of tiles to add (width)"));
                        widthPanel.add(new JTextField(10));
        
                        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
                        JButton setSizeButton = new JButton("Set Size");
        
                        JFrame frame = new JFrame("Map Size Editor");
                        setSizeButton.addActionListener(e -> transformResult (heightPanel, widthPanel, root, doc, selectedFile, frame, contentPanel));
                        buttonPanel.add(setSizeButton);
                        contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
                        contentPanel.add(heightPanel);
                        contentPanel.add(widthPanel);
                        contentPanel.add(buttonPanel);
        
                        frame.setContentPane(contentPanel);
                        frame.setMinimumSize(new Dimension(400, 200));
                        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        frame.pack();
                        frame.setVisible(true);
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(contentPanel, "Something is went wrong, sorry :" + ex.getMessage());
                    }
                }
        
                private void transformResult(JPanel heightPanel, JPanel widthPanel, Element root, Document doc, File selectedFile, JFrame frame, JPanel contentPanel) {
        
                    try {
                        System.out.println("you entered " + ((JTextField) heightPanel.getComponent(1)).getText());
                        float height = Float.parseFloat(root.getAttribute("height")) + (Integer.parseInt(((JTextField) heightPanel.getComponent(1)).getText()) * 256);
                        float width = Float.parseFloat(root.getAttribute("width")) + (Integer.parseInt(((JTextField) widthPanel.getComponent(1)).getText()) * 256);
                        System.out.println("height was: " + root.getAttribute("height"));
                        root.setAttribute("height", String.valueOf(height));
                        System.out.println("height is: " + root.getAttribute("height"));
        
                        System.out.println("width was: " + root.getAttribute("width"));
                        root.setAttribute("width", String.valueOf(width));
                        System.out.println("width is: " + root.getAttribute("width"));
        
        
                        TransformerFactory transformerFactory = TransformerFactory.newInstance();
                        Transformer transformer = transformerFactory.newTransformer();
                        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                        DOMSource source = new DOMSource(doc);
                        StreamResult result2 = new StreamResult(selectedFile);
                        transformer.transform(source, result2);
                        JOptionPane.showMessageDialog(frame, "Changes were successful.");
        
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(contentPanel, "Something is went wrong, sorry :" + ex.getMessage());
                    }
        
                }
        }

相关问题