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

解决TreeView编辑行时的问题,通过重写TreeCell实现编辑状态在失去焦点时自动取消,提高用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述: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;
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值