欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JTree 失去焦点可编辑  

程序员文章站 2022-07-13 09:31:27
...
import java.awt.*;
import java.awt.event.*;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;

public class ELS
{
	public static void main(String args[])
	{
		JFrame frame = new JFrame("Editable Tree");
		JTree tree = new JTree();
		tree.setEditable(true);

		DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree
				.getCellRenderer();
		TreeCellEditor editor = new LeafCellEditor(tree, renderer,
				new LeafEditor());
		tree.setCellEditor(editor);

		// This allows the edit to be saved if editing is interrupted
		// by a change in selection, focus, etc -> see method detail.
		tree.setInvokesStopCellEditing(true);

		JScrollPane scrollPane = new JScrollPane(tree);
		frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
		frame.setSize(300, 350);
		frame.setVisible(true);
	}
}

class LeafCellEditor extends DefaultTreeCellEditor
{
	public LeafCellEditor(JTree tree, DefaultTreeCellRenderer renderer)
	{
		super(tree, renderer);
	}

	public LeafCellEditor(JTree tree, DefaultTreeCellRenderer renderer,
			TreeCellEditor editor)
	{
		super(tree, renderer, editor);
	}
}

class LeafEditor extends AbstractCellEditor implements TreeCellEditor,
		ActionListener
{
	JTextField textField;

	public LeafEditor()
	{
		textField = new JTextField();
		textField.addActionListener(this);
	}

	public Component getTreeCellEditorComponent(JTree tree, Object value,
			boolean isSelected, boolean expanded, boolean leaf, int row)
	{
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
		textField.setText(node.toString());
		return textField;
	}

	public boolean isCellEditable(EventObject event)
	{
		// System.out.println("event = " + event);
		// Get initial setting
		boolean returnValue = super.isCellEditable(event);
		if (event instanceof MouseEvent)
		{
			// If still possible, check if current tree node is a leaf
			if (returnValue)
			{
				JTree tree = (JTree) event.getSource();
				Object node = tree.getLastSelectedPathComponent();
				if ((node != null) && (node instanceof TreeNode))
				{
					TreeNode treeNode = (TreeNode) node;
					returnValue = treeNode.isLeaf();
				}
			}
		}
		return returnValue;
	}

	public Object getCellEditorValue()
	{
		return textField.getText();
	}

	/** Press enter key to save the edited value. */
	public void actionPerformed(ActionEvent e)
	{
		super.stopCellEditing();
	}
}