此小程序应采用存储在 menuTree 中的树并遵循基于它的菜单构造。
currentNode 存储小程序当前所在的菜单,并且它的每个子项都应显示为按钮。
单击按钮后,小程序应将您带到一个新菜单,表示单击的按钮。
我无法在单击另一个按钮时更改按钮。
我不确定这棵树是否构造正确,因为它不是特别容易测试。
任何帮助将不胜感激。
谢谢你。
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;
import java.awt.*;
public class Menu extends JApplet implements ActionListener{
private static final long serialVersionUID = 2142470002L;
private JTree menuTree;
private DefaultMutableTreeNode currentNode;
private JPanel buttonPanel;
public void init(){
this.setSize(700, 550);
buttonPanel=new JPanel();
buttonPanel.setSize(300, 500);
this.add(buttonPanel);
/**
* will make node out of the first entry in the array, then make nodes out of subsequent entries
* and make them child nodes of the first one. The process is repeated recursively for entries that are arrays.
* this idea of tree declaration as well as the code from the method was lovingly
* stolen from: http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JTree.html
*/
Object [] menuNames = { "ROOT",
new Object[] { "Classic Chess",
new Object[] { "Game",
"AI",
"Hotseat",
"Online"
},
"Challenges",
new Object[]{ "Practice",
"Situations",
"Coaching"
},
},
new Object[] { "Fairy Chess",
new Object[] { "Game",
"AI",
"Hotseat",
"Online"
},
"Challenges",
new Object[]{ "Practice",
"Situations",
"Coaching"
},
"Create Pieces"
}
};
currentNode=processHierarchy(menuNames);
menuTree = new JTree(currentNode);
initializeButtons(currentNode);
}
/**
* Clicking one of the buttons(which should be in the children of the currentNode), takes you to that node in the tree
* setting currentNode to that node and redoing buttons to represent its children.
*/
public void actionPerformed(ActionEvent ae){
Button b=(Button)ae.getSource();
for(int i =0; i<currentNode.getChildCount(); i++){
if(b.getLabel().equals(currentNode.getChildAt(i)+"")){
currentNode=(DefaultMutableTreeNode)currentNode.getChildAt(i);
initializeButtons(currentNode);
}
}
}
/**
* will make node out of the first entry in the array, then make nodes out of subsequent entries
* and make them child nodes of the first one. The process is repeated recursively for entries that are arrays.
* this idea of tree declaration as well as the code from the method was lovingly
* stolen from: http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JTree.html
*/
private DefaultMutableTreeNode processHierarchy(Object[] hierarchy) {
DefaultMutableTreeNode node = new DefaultMutableTreeNode(hierarchy[0]);
DefaultMutableTreeNode child;
for (int i = 1; i < hierarchy.length; i++) {
Object nodeSpecifier = hierarchy[i];
if (nodeSpecifier instanceof Object[]) // Ie node with children
child = processHierarchy((Object[]) nodeSpecifier);
else
child = new DefaultMutableTreeNode(nodeSpecifier); // Ie Leaf
node.add(child);
}
return (node);
}
/**
* creates buttons for each child of the given node, labels them with their String value, and adds them to the panel.
*/
private void initializeButtons(DefaultMutableTreeNode node){
Button b;
buttonPanel.removeAll();
for(int i =0; i<node.getChildCount(); i++){
b=new Button();
b.setLabel(""+node.getChildAt(i));
buttonPanel.add(b);
}
}
}