一个关于tree的问题

zhangwei9730 2003-05-14 11:20:13
大家好:
我现在编写一个关于“树组件的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;
}
}
}

...全文
124 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangwei9730 2003-05-15
  • 打赏
  • 举报
回复
好用了。多谢
yuanmeng163 2003-05-15
  • 打赏
  • 举报
回复
不会吧?我都通过了啊。
去掉mySingleClick()方法,把内部类改成我那样写的。
zhangwei9730 2003-05-15
  • 打赏
  • 举报
回复
依然不行阿
geyf 2003-05-15
  • 打赏
  • 举报
回复
看看你的代码,问题在这:(开始被你误导了,呵呵:)

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);//直接用mySingleClick(e);
}
......
steelabeer 2003-05-15
  • 打赏
  • 举报
回复
不会吧,给你试了好多次了,没问题呀
zhangwei9730 2003-05-15
  • 打赏
  • 举报
回复
我按照你写的试了,还是不行阿
geyf 2003-05-15
  • 打赏
  • 举报
回复
just try:

Point p=e.getPoint();
SwingUtilities.convertPointToScreen(p,tree);
popupMenu1.show(tree, p.x, p.y);
steelabeer 2003-05-15
  • 打赏
  • 举报
回复
if (javax.swing.SwingUtilities.isRightMouseButton(e)){
popupMenu1.add(menu1);
menu1.add(menuItem1);
menu1.add(menuItem3);
menu1.add(menuItem4);
tree.add(popupMenu1);
popupMenu1.show(tree,e.getX(),e.getY());/*问题就在这*/
}

我给你试了,如上
steelabeer 2003-05-15
  • 打赏
  • 举报
回复
if (javax.swing.SwingUtilities.isRightMouseButton(e)){
popupMenu1.add(menu1);
menu1.add(menuItem1);
menu1.add(menuItem3);
menu1.add(menuItem4);
tree.add(popupMenu1);
popupMenu1.show(tree,e.getX(),e.getY());/*问题就在这*/
}

我给你试了,如上
zhangwei9730 2003-05-15
  • 打赏
  • 举报
回复
我就是这样改的,但是还是不行阿
yuanmeng163 2003-05-15
  • 打赏
  • 举报
回复
你按照下面的改写一下内部类:

MouseListener ml = new MouseAdapter() {

public void mouseReleased(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(tree, e.getX(), e.getY()); }

}
};
zhangwei9730 2003-05-15
  • 打赏
  • 举报
回复
还是不行阿,那位大哥还有高见,帮我解决一下
geyf 2003-05-15
  • 打赏
  • 举报
回复
contentPane应该是tree吧
zhangwei9730 2003-05-14
  • 打赏
  • 举报
回复
还是不行阿?大哥。多给点指教好么
yuanmeng163 2003-05-14
  • 打赏
  • 举报
回复
contentPane改成this

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧