一个关于tree的问题
大家好:
我现在编写一个关于“树组件的java程序,用jb生成application,基本思想是
放置一个tree组件,点击下面的按钮,可以增加节点。(已经通过)
现在我想作的是,在树上点击鼠标右键,希望能够出现一个弹出菜单,就会抛出异常。
“java.lang.RuntimeException: parent not showing on screen”,我知道原因是由于
弹出菜单的祖先不是容器。但是具体我搞不清楚。希望那位大虾给我点指教。(下面是源码,有问题的地方我已经标出,请大家指教)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/
public class Frame6 extends JFrame {
String[][] data={{"Colors","red","Blue","Green"},{"Flavors","Tart","Sweet","Bland"},
{"Length","Short","Medium","Long"},
{"Volume","High","Medium","Low"},{"Intensity","High","Medium","low"}};
PopupMenu popupMenu1 = new PopupMenu();
Menu menu1 = new Menu();
MenuItem menuItem1 = new MenuItem();
MenuItem menuItem3 = new MenuItem();
MenuItem menuItem4 = new MenuItem();
private JPanel contentPane;
private BorderLayout borderLayout1 = new BorderLayout();
static int i=0;
DefaultMutableTreeNode root,child,chosen;
JTree tree;
javax.swing.tree.DefaultTreeModel model;
/*问题主要出在下面,请大家指教*/
public void mySingleClick(MouseEvent e){
if (javax.swing.SwingUtilities.isRightMouseButton(e)){
popupMenu1.add(menu1);
menu1.add(menuItem1);
menu1.add(menuItem3);
menu1.add(menuItem4);
contentPane.add(popupMenu1);
popupMenu1.show(contentPane, e.getX(), e.getY());/*问题就在这*/
}
}
//Construct the frame
ActionListener al=new ActionListener(){
public void actionPerformed(ActionEvent e){
if(i<data.length){
child=new Branch(data[i++]).node();
chosen=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
if (chosen==null)
chosen=root;
model.insertNodeInto(child,chosen,0);
}
}
};
public Frame6() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
MouseListener ml = new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
Frame6 mytree=new Frame6();
JPopupMenu popup=null;
int selRow = tree.getRowForLocation(e.getX(), e.getY());
TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
if(selRow != -1) {
if(e.getClickCount() == 1) {
mytree.mySingleClick(e);
}
else if(e.getClickCount() == 2) {
//myDoubleClick(selRow, selPath);
}
}
}
};
//Component initialization
private void jbInit() throws Exception {
//setIconImage(Toolkit.getDefaultToolkit().createImage(Frame6.class.getResource("[Your Icon]")));
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
root=new DefaultMutableTreeNode("root");
tree=new JTree(root);
contentPane.add(new JScrollPane(tree),BorderLayout.CENTER);
model=(DefaultTreeModel)tree.getModel();
this.setSize(new Dimension(400, 300));
this.setTitle("Frame Title");
JButton test=new JButton("Press Me");
test.addActionListener(al);
tree.addMouseListener(ml);
contentPane.add(test, BorderLayout.SOUTH);
}
//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
class Branch {
javax.swing.tree.DefaultMutableTreeNode r;
public Branch(String[] data){
r=new DefaultMutableTreeNode(data[0]);
for (int i=1;i<data.length;i++)
{
r.add(new DefaultMutableTreeNode(data[i]));
if (i==1);
r.removeFromParent();
}
}
public DefaultMutableTreeNode node(){
return r;
}
}
}