java fx中的TreeView行处于编辑状态时,当点击空白处取消编辑

问题描述:TreeView编辑行的时候存在这么一个问题:当某行处于编辑时,只有点击TreeItem(即有数据部分)才能够取消当前正在编辑的行,点击Treeview的空白处时编辑状态不取消。

主要思路是:开始编辑时让TextField获取焦点,然后监听textfield的焦点事件,当失去焦点时取消编辑。以下是重写TreeCell部分

TreeView<String> tree = new TreeView<>(rootClass);
tree.setEditable(true);
tree.setCellFactory((TreeView<String> p) -> new TextFieldTreeCellImpl());
tree.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
/**
	 * 重写树TreeCell,使得TreeCell可编辑
	 * 
	 * @author user
	 *
	 */
	private final class TextFieldTreeCellImpl extends TreeCell<String> {
		private TextField textField;

		public TextFieldTreeCellImpl() {
		}

		@Override
		public void startEdit() {
			super.startEdit();
			createTextField();
			setText(null);
			setGraphic(textField);
			textField.selectAll();	
			textField.requestFocus(); //textFiled获取焦点
		}

		@Override
		public void cancelEdit() {
			super.cancelEdit();
			setText((String) getItem());
			setGraphic(getTreeItem().getGraphic());
			textField = null;
		}

		@Override
		public void updateItem(String item, boolean empty) {
			super.updateItem(item, empty);
			if (empty) {
				setText(null);
				setGraphic(null);
			} else {
				if (isEditing()) {
					if (textField != null) {
						textField.setText(getString());
					}
					setText(null);
					setGraphic(textField);
				} else {
					setText(getString());
					setGraphic(getTreeItem().getGraphic());
				}
			}
		}

		private void createTextField() {
			textField = new TextField(getString());			
			oldName = getString();
			textField.setOnKeyReleased((KeyEvent t) -> {
				if (t.getCode() == KeyCode.ENTER) {
					commitEdit(textField.getText());
				} else if (t.getCode() == KeyCode.ESCAPE) {
					cancelEdit();
				}
			});
			//textFiled失去焦点时取消编辑
			textField.focusedProperty().addListener(new InvalidationListener() {
				@Override
				public void invalidated(Observable observable) {
					if (!textField.isFocused()) {
						cancelEdit();
					} 
				}
			});
			
		}

		private String getString() {
			String str = getItem() == null ? "" : getItem().toString();
			return str;
		}
	}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java在窗口添加树形菜单TreeView源代码,分享给JAVA新手的一个例子,JTextField jtfInfo; //文本域,用于显示点击的节点名称   public JTreeDemo(){    super("森林状的关系图"); //调用父类构造函数       DefaultMutableTreeNode root = new DefaultMutableTreeNode("设置"); //生成根节点    DefaultMutableTreeNode node1=new DefaultMutableTreeNode("常规"); //生成节点一    node1.add(new DefaultMutableTreeNode("默认路径")); //增加新节点到节点一上    node1.add(new DefaultMutableTreeNode("保存选项"));    root.add(node1); //增加节点一到根节点上    root.add(new DefaultMutableTreeNode("界面"));    root.add(new DefaultMutableTreeNode("提示声音"));    root.add(new DefaultMutableTreeNode("打印"));       JTree tree = new JTree(root); //得到JTree的实例    DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer(); //得到JTree的Renderer    renderer.setLeafIcon(null); //设置叶子节点图标为空    renderer.setClosedIcon(null); //设置关闭节点的图标为空    renderer.setOpenIcon(null); //设置打开节点的图标为空       tree.addTreeSelectionListener(new TreeSelectionListener() { //选择节点的事件处理    public void valueChanged(TreeSelectionEvent evt) {    TreePath path = evt.getPath(); //得到选择路径    String info=path.getLastPathComponent().toString(); //得到选择的节点名称    jtfInfo.setText(info); //在文本域显示名称    }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值