解答例 - 実習課題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); } }