首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

手把手教你用 Java Swing 打造 XML 編輯器(二):雙視圖框架與 XTree 增強

     編輯:Java 相關知識

承上啟下

上一篇完成了 XTree 核心組件(繼承 JTree,JAXP 解析 XML 構建樹模型)。本篇構建雙分欄編輯器框架:左側樹視圖、右側文本編輯區,並增強 XTree 魯棒性(默認樹、異常處理)。

一、XmlEditor 主視窗架構

組件佈局

JFrame (BorderLayout)
 ├─ NORTH: JButton "Refresh" (刷新樹視圖)
 ├─ CENTER: JSplitPane (HORIZONTAL_SPLIT)
 │    ├─ LEFT:  JScrollPane -> XTree
 │    └─ RIGHT: JScrollPane -> JTextArea
 └─ SOUTH: (可選狀態欄)

關鍵代碼

public class XmlEditor extends JFrame implements ActionListener {
    private XTree xTree;
    private JTextArea textArea;
    private JSplitPane splitPane;
    private JButton refreshButton;

    public XmlEditor(String title) throws ParserConfigurationException {
        super(title);
        initComponents();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
    }

    private void initComponents() {
        // 刷新按鈕
        refreshButton = new JButton("Refresh");
        refreshButton.addActionListener(this);
        add(refreshButton, BorderLayout.NORTH);

        // 左側:樹視圖
        xTree = new XTree(); // 使用無參構造器,顯示默認歡迎樹
        JScrollPane leftScroll = new JScrollPane(xTree);

        // 右側:文本編輯區
        textArea = new JTextArea(200, 150);
        textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
        JScrollPane rightScroll = new JScrollPane(textArea);

        // 分欄面板
        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScroll, rightScroll);
        splitPane.setOneTouchExpandable(true); // 單鍵展開/摺疊
        splitPane.setDividerLocation(300);
        Dimension minSize = new Dimension(200, 150);
        leftScroll.setMinimumSize(minSize);
        rightScroll.setMinimumSize(minSize);
        splitPane.setPreferredSize(new Dimension(800, 600));
        add(splitPane, BorderLayout.CENTER);
    }

    // 刷新按鈕事件:將文本區內容解析並更新樹
    public void actionPerformed(ActionEvent e) {
        if ("Refresh".equals(e.getActionCommand())) {
            xTree.refresh(textArea.getText());
        }
    }
    // ... main 方法與命令行參數處理
}

二、XTree 組件深度增強

1. 拆解構建邏輯:新增 buildTree(String)

private DefaultTreeModel buildTree(String xmlText) {
    try {
        Node root = parseXml(xmlText);
        if (root != null) {
            DefaultMutableTreeNode treeRoot = createTreeNode(root);
            return new DefaultTreeModel(treeRoot);
        }
    } catch (Exception ex) {
        ex.printStackTrace(); // 後續改為彈窗提示
    }
    return null; // 解析失敗返回 null
}

2. 默認歡迎樹:buildWelcomeTree()

無命令行參數啟動時顯示使用指引,而非空白界面:

private DefaultTreeModel buildWelcomeTree() {
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("Welcome to XML View 1.0");
    DefaultMutableTreeNode instructions = new DefaultMutableTreeNode("Instructions");
    instructions.add(new DefaultMutableTreeNode("Opening XML Documents: java XmlEditor file.xml"));
    instructions.add(new DefaultMutableTreeNode("Editing: Modify text in right pane, click Refresh to update tree."));
    instructions.add(new DefaultMutableTreeNode("Saving: Not yet implemented (coming in Part 3)."));
    root.add(instructions);
    return new DefaultTreeModel(root);
}

3. 重構構造器:支援默認與指定 XML 兩種模式

// 無參構造器:顯示歡迎樹
public XTree() throws ParserConfigurationException {
    super();
    getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    setShowsRootHandles(true);
    setEditable(false);
    initParser();
    setModel(buildWelcomeTree());
}

// 帶參構造器:解析指定 XML
public XTree(String xmlText) throws ParserConfigurationException {
    this(); // 復用初始化邏輯
    refresh(xmlText);
}

// 公開刷新方法:供外部調用(如刷新按鈕)
public void refresh(String xmlText) {
    DefaultTreeModel model = buildTree(xmlText);
    if (model != null) {
        setModel(model);
    } else {
        // 保持原模型不變,或顯示錯誤節點
        JOptionPane.showMessageDialog(this, "Invalid XML: " + lastParseError, "Parse Error", JOptionPane.ERROR_MESSAGE);
    }
}

4. 異常處理遷移:從 System.exit() 到優雅降級

原 parseXml() 拋出異常直接 System.exit(0),現改為捕獲異常、記錄錯誤信息、返回 null,由調用者決定如何提示用戶,避免整個應用崩潰。

三、命令行啟動邏輯優化

public static void main(String[] args) {
    String fileName = "";
    ArrayList xmlLines = new ArrayList<>();
    
    if (args.length > 0) {
        fileName = args[0];
        if (fileName.toLowerCase().endsWith(".xml")) {
            try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    xmlLines.add(line);
                }
                new XmlEditor("XmlEditor 1.0", xmlLines).setVisible(true);
            } catch (IOException | ParserConfigurationException ex) {
                System.err.println("Error: " + ex.getMessage());
                showHelp();
            }
        } else {
            showHelp();
        }
    } else {
        // 無參啟動:顯示歡迎界面
        try {
            new XmlEditor("XmlEditor 1.0").setVisible(true);
        } catch (ParserConfigurationException ex) {
            ex.printStackTrace();
        }
    }
}

四、測試驗證要點

  1. 無參啟動 → 顯示歡迎樹與空白編輯區。
  2. 輸入合法 XML → 點擊 Refresh → 左側樹正確展開。
  3. 輸入非法 XML (如缺失閉合標籤) → Refresh → 彈出錯誤對話框,樹保持原狀。
  4. 拖動分割條 → 兩側面板自適應縮放。
  5. 修改文本 → 再次 Refresh → 樹即時更新。

總結

本篇確立了雙視圖編輯器骨架,XTree 變身為健壯的可複用組件(默認樹、錯誤容錯、公開刷新 API)。下一篇將補齊文件操作(打開/保存)、菜單系統與退出確認,交付一個真正可用的桌面工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved