JTree问题 我想给数中的几点添加鼠标右击,出现一个下拉菜单,包含删除,新建操作,该怎么操作呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellEditor; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; public class Test extends JFrame implements MouseListener, ActionListener { JTree tree; JPopupMenu popMenu; JMenuItem addItem; JMenuItem delItem; JMenuItem editItem; public Test() { tree = new JTree(); tree.setEditable(true); tree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addMouseListener(this); tree.setCellEditor(new DefaultTreeCellEditor(tree, new DefaultTreeCellRenderer())); getContentPane().add(tree); setSize(200, 200); popMenu = new JPopupMenu(); addItem = new JMenuItem("添加"); addItem.addActionListener(this); delItem = new JMenuItem("删除"); delItem.addActionListener(this); editItem = new JMenuItem("修改"); editItem.addActionListener(this); popMenu.add(addItem); popMenu.add(delItem); popMenu.add(editItem); } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { TreePath path = tree.getPathForLocation(e.getX(), e.getY()); // 关键是这个方法的使用 if (path == null) { return; } tree.setSelectionPath(path); if (e.getButton() == 3) { popMenu.show(tree, e.getX(), e.getY()); } } public void mouseReleased(MouseEvent e) { } public void actionPerformed(ActionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree .getLastSelectedPathComponent(); if (e.getSource() == addItem) { ((DefaultTreeModel) tree.getModel()).insertNodeInto( new DefaultMutableTreeNode("Test"), node, node .getChildCount()); tree.expandPath(tree.getSelectionPath()); } else if (e.getSource() == delItem) { if (node.isRoot()) { return; } ((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node); } else if (e.getSource() == editItem) { tree.startEditingAtPath(tree.getSelectionPath()); } } public static void main(String[] args) { Test frame = new Test(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 简单看一下吧,如果需要封装或者什么的自己看情况 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellEditor; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; public class Test extends JFrame implements MouseListener, ActionListener { JTree tree; JPopupMenu popMenu; JMenuItem addItem; JMenuItem delItem; JMenuItem editItem; public Test() { tree = new JTree(); tree.setEditable(true); tree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addMouseListener(this); tree.setCellEditor(new DefaultTreeCellEditor(tree, new DefaultTreeCellRenderer())); getContentPane().add(tree); setSize(200, 200); popMenu = new JPopupMenu(); addItem = new JMenuItem("添加"); addItem.addActionListener(this); delItem = new JMenuItem("删除"); delItem.addActionListener(this); editItem = new JMenuItem("修改"); editItem.addActionListener(this); popMenu.add(addItem); popMenu.add(delItem); popMenu.add(editItem); } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { TreePath path = tree.getPathForLocation(e.getX(), e.getY()); // 关键是这个方法的使用 if (path == null) { return; } tree.setSelectionPath(path); if (e.getButton() == 3) { popMenu.show(tree, e.getX(), e.getY()); } } public void mouseReleased(MouseEvent e) { } public void actionPerformed(ActionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree .getLastSelectedPathComponent(); if (e.getSource() == addItem) { ((DefaultTreeModel) tree.getModel()).insertNodeInto( new DefaultMutableTreeNode("Test"), node, node .getChildCount()); tree.expandPath(tree.getSelectionPath()); } else if (e.getSource() == delItem) { if (node.isRoot()) { return; } ((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node); } else if (e.getSource() == editItem) { tree.startEditingAtPath(tree.getSelectionPath()); } } public static void main(String[] args) { Test frame = new Test(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 可以满足需求,但是修改不太好用 或者不通过设置Tree.setEditable(true)来实现。通过Tree的CellEditor实现编辑: testTree.setEditable(false); testTree.setCellEditor(new DefaultTreeCellEditor(testTree, (NetTestIconNodeRenderer) testTree.getCellRenderer()) { /* CellEditor */ protected TreeCellEditor createTreeCellEditor() { /* 边界 */ Border aBorder = UIManager.getBorder("Tree.editorBorder"); /* TextField */ final DefaultTextField test = new DefaultTextField(aBorder); /* 添加动作事件 */ test.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); test.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { testTree.setEditable(false); } }); DefaultCellEditor editor = new DefaultCellEditor(test) { public boolean shouldSelectCell(java.util.EventObject event) { boolean retValue = super.shouldSelectCell(event); getComponent().requestFocus(); return retValue; } public void cancelEditing() { test.setText(nodeName); testTree.setEditable(false); } public Object getCellEditorValue() { if (test.getText().trim().length() > 0) { return test.getText().trim(); } else { return nodeName; } } }; return editor; } }); 请问,Java中以下三种定义方式有何不同之处? java中子类继承父类的构造方法吗? 团队遵守Command和Query分离的编码习惯能让后来者快速融入开发 对于Java中编码解码的一点理解,各位看对吗?要不然该是怎样? java的输出格式问题,请人帮忙回答 请问这是什么错误呀,我环境变量都配好了 请问下struts中标签的动态赋值的问题 菜鸟问题:到底一个软件是怎样做的???程序写好了还要做些什么啊??? Runnable接口的run方法的运行 循环小谜题,关于j++的问题 java 如何画一个关闭按钮?
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel; public class Test extends JFrame implements MouseListener, ActionListener {
JTree tree; JPopupMenu popMenu; JMenuItem addItem;
JMenuItem delItem;
JMenuItem editItem; public Test() {
tree = new JTree();
tree.setEditable(true);
tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.addMouseListener(this);
tree.setCellEditor(new DefaultTreeCellEditor(tree,
new DefaultTreeCellRenderer()));
getContentPane().add(tree);
setSize(200, 200); popMenu = new JPopupMenu();
addItem = new JMenuItem("添加");
addItem.addActionListener(this);
delItem = new JMenuItem("删除");
delItem.addActionListener(this);
editItem = new JMenuItem("修改");
editItem.addActionListener(this); popMenu.add(addItem);
popMenu.add(delItem);
popMenu.add(editItem);
} public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) {
TreePath path = tree.getPathForLocation(e.getX(), e.getY()); // 关键是这个方法的使用
if (path == null) {
return;
}
tree.setSelectionPath(path); if (e.getButton() == 3) {
popMenu.show(tree, e.getX(), e.getY());
}
} public void mouseReleased(MouseEvent e) { } public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();
if (e.getSource() == addItem) {
((DefaultTreeModel) tree.getModel()).insertNodeInto(
new DefaultMutableTreeNode("Test"), node, node
.getChildCount());
tree.expandPath(tree.getSelectionPath());
} else if (e.getSource() == delItem) {
if (node.isRoot()) {
return;
}
((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node);
} else if (e.getSource() == editItem) {
tree.startEditingAtPath(tree.getSelectionPath());
}
} public static void main(String[] args) {
Test frame = new Test();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
} 简单看一下吧,如果需要封装或者什么的自己看情况
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel; public class Test extends JFrame implements MouseListener, ActionListener {
JTree tree; JPopupMenu popMenu; JMenuItem addItem;
JMenuItem delItem;
JMenuItem editItem; public Test() {
tree = new JTree();
tree.setEditable(true);
tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.addMouseListener(this);
tree.setCellEditor(new DefaultTreeCellEditor(tree,
new DefaultTreeCellRenderer()));
getContentPane().add(tree);
setSize(200, 200); popMenu = new JPopupMenu();
addItem = new JMenuItem("添加");
addItem.addActionListener(this);
delItem = new JMenuItem("删除");
delItem.addActionListener(this);
editItem = new JMenuItem("修改");
editItem.addActionListener(this); popMenu.add(addItem);
popMenu.add(delItem);
popMenu.add(editItem);
} public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) {
TreePath path = tree.getPathForLocation(e.getX(), e.getY()); // 关键是这个方法的使用
if (path == null) {
return;
}
tree.setSelectionPath(path); if (e.getButton() == 3) {
popMenu.show(tree, e.getX(), e.getY());
}
} public void mouseReleased(MouseEvent e) { } public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();
if (e.getSource() == addItem) {
((DefaultTreeModel) tree.getModel()).insertNodeInto(
new DefaultMutableTreeNode("Test"), node, node
.getChildCount());
tree.expandPath(tree.getSelectionPath());
} else if (e.getSource() == delItem) {
if (node.isRoot()) {
return;
}
((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node);
} else if (e.getSource() == editItem) {
tree.startEditingAtPath(tree.getSelectionPath());
}
} public static void main(String[] args) {
Test frame = new Test();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
} 可以满足需求,但是修改不太好用
(NetTestIconNodeRenderer) testTree.getCellRenderer()) {
/* CellEditor */
protected TreeCellEditor createTreeCellEditor() {
/* 边界 */
Border aBorder = UIManager.getBorder("Tree.editorBorder");
/* TextField */
final DefaultTextField test = new DefaultTextField(aBorder);
/* 添加动作事件 */
test.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { }
}); test.addFocusListener(new FocusAdapter() {
public void focusLost(FocusEvent e) {
testTree.setEditable(false);
}
}); DefaultCellEditor editor = new DefaultCellEditor(test) { public boolean shouldSelectCell(java.util.EventObject event) {
boolean retValue = super.shouldSelectCell(event);
getComponent().requestFocus();
return retValue;
} public void cancelEditing() {
test.setText(nodeName);
testTree.setEditable(false);
} public Object getCellEditorValue() {
if (test.getText().trim().length() > 0) {
return test.getText().trim();
} else {
return nodeName;
}
}
}; return editor;
}
});