java表示当前结点,Java Swing - 如何在JTree中获取当前节点的深度...

import java.awt.Component;

import java.awt.Dimension;

import java.awt.Point;

import java.awt.Rectangle;

import java.awt.event.MouseEvent;

import java.util.EventObject;

import javax.swing.DefaultCellEditor;

import javax.swing.DefaultComboBoxModel;

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTree;

import javax.swing.SwingUtilities;

import javax.swing.WindowConstants;

import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.tree.TreeCellRenderer;

import javax.swing.tree.TreePath;

public class Main {

public static void main(String[] args) {

String[] m = { "A", "B", "C" };

DefaultMutableTreeNode root = new DefaultMutableTreeNode(

new Node("Values"));

root.add(new DefaultMutableTreeNode(new Node("Value 1", m)));

root.add(new DefaultMutableTreeNode(new Node("Value 2", m)));

DefaultMutableTreeNode leaf = new DefaultMutableTreeNode(new Node(

"Value 3", m));

root.add(leaf);

leaf.add(new DefaultMutableTreeNode(new Node("Value 3A", m)));

leaf.add(new DefaultMutableTreeNode(new Node("Value 3B", m)));

JTree tree = new JTree(root);

RendererDispatcher rendererDispatcher = new RendererDispatcher(

new JComboBox());

RendererDispatcher editorDispatcher = new RendererDispatcher(

new JComboBox());

tree.setCellRenderer(rendererDispatcher);

tree.setCellEditor(editorDispatcher);

tree.setEditable(true);

JFrame f = new JFrame();

f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

f.getContentPane().add(new JScrollPane(tree));

f.setSize(320, 240);

f.setVisible(true);

}

}

class Node {

String name;

String[] Values;

int myIndex;

public Node(String name, String... Values) {

this.name = name;

this.Values = Values;

}

public String toString() {

return name;

}

public int getMyIndex() {

return myIndex;

}

public void setIndex(int selectedValueIndex) {

this.myIndex = selectedValueIndex;

}

public String[] getValues() {

return Values;

}

}

class RendererDispatcher extends DefaultCellEditor implements TreeCellRenderer {

JPanel panel = new JPanel();

JLabel ValueName = new JLabel();

JComboBox comboBox;

Node node;

public RendererDispatcher(JComboBox comboBox) {

super(comboBox);

this.comboBox = comboBox;

panel.setOpaque(false);

panel.add(ValueName);

panel.add(comboBox);

}

@Override

public Component getTreeCellRendererComponent(JTree tree, Object value,

boolean selected, boolean expanded, boolean leaf, int row,

boolean hasFocus) {

Node node = extractNode(value);

setContents(node);

return panel;

}

@Override

public Component getTreeCellEditorComponent(JTree tree, Object value,

boolean selected, boolean expanded, boolean leaf, int row) {

Node node = extractNode(value);

setContents(node);

this.node = node;

return panel;

}

@Override

public Object getCellEditorValue() {

Object o = super.getCellEditorValue();

DefaultComboBoxModel m = (DefaultComboBoxModel) comboBox

.getModel();

Node n = new Node(ValueName.getText(), node.getValues());

n.setIndex(m.getIndexOf(o));

return n;

}

@Override

public boolean isCellEditable(final EventObject event) {

Object source = event.getSource();

if (!(source instanceof JTree) || !(event instanceof MouseEvent)) {

return false;

}

JTree tree = (JTree) source;

MouseEvent mouseEvent = (MouseEvent) event;

TreePath path = tree.getPathForLocation(mouseEvent.getX(),

mouseEvent.getY());

if (path == null) {

return false;

}

Object node = path.getLastPathComponent();

if (node == null || !(node instanceof DefaultMutableTreeNode)) {

return false;

}

Rectangle r = tree.getPathBounds(path);

if (r == null) {

return false;

}

Dimension d = panel.getPreferredSize();

r.setSize(new Dimension(d.width, r.height));

if (r.contains(mouseEvent.getX(), mouseEvent.getY())) {

Point pt = SwingUtilities

.convertPoint(tree, mouseEvent.getPoint(), panel);

Object o = SwingUtilities.getDeepestComponentAt(panel, pt.x, pt.y);

if (o instanceof JComboBox) {

comboBox.showPopup();

} else if (o instanceof Component) {

Object oo = SwingUtilities.getAncestorOfClass(JComboBox.class,

(Component) o);

if (oo instanceof JComboBox) {

comboBox.showPopup();

}

}

return true;

}

return delegate.isCellEditable(event);

}

private static Node extractNode(Object value) {

if (value instanceof DefaultMutableTreeNode) {

DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;

Object userObject = node.getUserObject();

if (userObject instanceof Node) {

return (Node) userObject;

}

}

return null;

}

private void setContents(Node node) {

if (node == null) {

return;

}

ValueName.setText(node.toString());

DefaultComboBoxModel model = (DefaultComboBoxModel) comboBox

.getModel();

model.removeAllElements();

if (node.getValues().length > 0) {

panel.add(comboBox);

for (String s : node.getValues()) {

model.addElement(s);

}

comboBox.setSelectedIndex(node.getMyIndex());

} else {

panel.remove(comboBox);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值