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

