目次へ

解答例 - 実習課題4 - 13.ツリー

(実習課題4)

実習課題1のプログラムを改良しなさい。

  • 「追加」ボタンを追加し、現在選択されているノードにリーフを追加できるようにする事。リーフの文字はその都度、設定できるようにする事。またリーフにリーフは追加できないようにする事。
  • 「削除」ボタンを追加し、現在選択されているノード(またはリーフ)を削除できるようにする事。

解答例

/**
 * ChangeableJTreeJFrame.java
 * TECHSCORE Javaユーザインタフェース13章 実習課題4
 *
 * Copyright (c) 2004 Four-Dimensional Data, Inc.
 */

package com.techscore.ui.chapter13.exercise4;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Hashtable;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;

public class ChangeableJTreeFrame extends JFrame implements ActionListener {

    private JTree tree;
    private JButton addButton;
    private JButton delButton;

    public ChangeableJTreeFrame() {
        super("ChangeableJTreeFrame");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // JTreeの生成
        String[] lowerCases = { "a", "b", "c" };
        String[] upperCases = { "A", "B", "C" };
        Hashtable alphabets = new Hashtable();
        alphabets.put("小文字", lowerCases);
        alphabets.put("大文字", upperCases);

        String[] kanas = { "い", "ろ", "は" };
        String[] kanjis = { "山", "海", "空" };
        Hashtable japanese = new Hashtable();
        japanese.put("ひらがな", kanas);
        japanese.put("漢字", kanjis);

        Hashtable root = new Hashtable();
        root.put("英字", alphabets);
        root.put("和字", japanese);

        tree = new JTree(root);
        tree.setPreferredSize(new Dimension(250, 400));

        addButton = new JButton("ADD");
        addButton.addActionListener(this);
        delButton = new JButton("DELETE");
        delButton.addActionListener(this);

        getContentPane().add(tree, BorderLayout.NORTH);
        getContentPane().add(addButton, BorderLayout.WEST);
        getContentPane().add(delButton, BorderLayout.EAST);

        pack();
    }

    public void actionPerformed(ActionEvent event) {
        if (tree.getSelectionCount() != 1) {
            JOptionPane.showMessageDialog(this, "ノードをひとつだけ選択して下さい", "ERROR", JOptionPane.ERROR_MESSAGE);
            return;
        }

        DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
        MutableTreeNode selectedNode = (MutableTreeNode) tree.getSelectionPath().getLastPathComponent();

        if (event.getSource().equals(addButton)) {
            // 追加ボタンが押された
            if (model.isLeaf(selectedNode)) {
                JOptionPane.showMessageDialog(this, "リーフには追加できません", "ERROR", JOptionPane.ERROR_MESSAGE);
                return;
            }

            String leafName = JOptionPane.showInputDialog(this, "追加するリーフを入力して下さい");
            if ((leafName != null) && (!leafName.equals(""))) {
                model.insertNodeInto(new DefaultMutableTreeNode(leafName), selectedNode, 0);
            } else {
                JOptionPane.showMessageDialog(this, "何も入力されていません", "ERROR", JOptionPane.ERROR_MESSAGE);

            }
        } else if (event.getSource().equals(delButton)) {
            // 削除ボタンが押された
            model.removeNodeFromParent(selectedNode);
        }
    }

    public static void main(String[] args) {
        new ChangeableJTreeFrame().setVisible(true);
    }

}

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ