JavaFX2TreeView-如何更改进入编辑模式的默认行为?
受JavaFX教程的启发,我想知道如何改变行为,以编辑模式输入单元格。我想要的行为是JavaFX2TreeView-如何更改进入编辑模式的默认行为?,java,javafx-2,Java,Javafx 2,受JavaFX教程的启发,我想知道如何改变行为,以编辑模式输入单元格。我想要的行为是 单击鼠标左键:只需选择单元格 在两次鼠标左键单击时:选择单元格并调用某些操作 鼠标右键单击:在编辑模式下输入单元格 我试图在TreeView/TreeCell上安装鼠标事件处理程序,但该事件似乎已经被TreeCellBehavior使用 在TreeCellBehvior类中,有以下方法: private void simpleSelect(MouseEvent e) { TreeView tv =
- 单击鼠标左键:只需选择单元格
- 在两次鼠标左键单击时:选择单元格并调用某些操作
- 鼠标右键单击:在编辑模式下输入单元格
private void simpleSelect(MouseEvent e) {
TreeView tv = getControl().getTreeView();
TreeItem treeItem = getControl().getTreeItem();
int index = getControl().getIndex();
MultipleSelectionModel sm = tv.getSelectionModel();
boolean isAlreadySelected = sm.isSelected(index);
tv.getSelectionModel().clearAndSelect(index);
// handle editing, which only occurs with the primary mouse button
if (e.getButton() == MouseButton.PRIMARY) {
if (e.getClickCount() == 1 && isAlreadySelected) {
tv.edit(treeItem);
} else if (e.getClickCount() == 1) {
// cancel editing
tv.edit(null);
} else if (e.getClickCount() == 2/* && ! getControl().isEditable()*/) {
if (treeItem.isLeaf()) {
// attempt to edit
tv.edit(treeItem);
} else {
// try to expand/collapse branch tree item
treeItem.setExpanded(! treeItem.isExpanded());
}
}
}
}
我不确定是否可以用我自己的实现替换TreeCellBehavior。虽然这个方法是私有的,但我不确定这是否是正确的方法。有什么想法吗?我自己想出来的。默认情况下,我禁用TreeView的可编辑功能。对于每个TreeItem,都有一个上下文菜单,允许更改项目名称。如果调用上下文菜单操作,则TreeView设置为可编辑,并调用当前TreeItem的TreeView.edit()。现在startEdit()在幕后被调用,编辑模式处于活动状态 然而,在按下enter键并调用CommitteIt()之后,我出现了一些奇怪的行为。此方法检查单元格是否仍处于编辑模式(即编辑模式,因此返回true),从而导致内部调用cancelEdit()?!?!作为一种解决方法,我引入了CommitModelProperty,如果设置了,则签入cancelEdit()。。否则,将永远不会设置新的文本值 这是我的密码:
public class FolderTreeCell extends TreeCell<FolderCellType> {
// workaround for a strange behaviour in commitEdit.. see initTextFieldListener()
private BooleanProperty commitModeProperty = new SimpleBooleanProperty(false);
public FolderTreeCell() {
assert Platform.isFxApplicationThread();
}
private ContextMenu createContextMenu() {
MenuItem menuItem = new MenuItem("Change folder name");
menuItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent evt) {
getTreeView().setEditable(true);
getTreeView().edit(getTreeItem());
}
});
return new ContextMenu(menuItem);
}
private void initTextFieldListener() {
getItem().textFieldProperty().get().setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent evt) {
if (evt.getCode() == KeyCode.ENTER) {
commitEdit(getItem()); // TODO calls updateItem() when isEditing() is true causing invocation of cancelEdit() ?!?!
}
}
});
}
@Override
public void commitEdit(FolderCellType newFolderCellType) {
commitModeProperty.set(true);
super.commitEdit(newFolderCellType);
commitModeProperty.set(false);
}
@Override
public void startEdit() {
super.startEdit();
setGraphic(getItem().getEditBox());
if (getItem().textFieldProperty().get().getOnKeyReleased() == null) {
initTextFieldListener();
}
getItem().textFieldProperty().get().selectAll();
getItem().textFieldProperty().get().requestFocus();
}
@Override
public void cancelEdit() {
super.cancelEdit();
getTreeView().setEditable(false);
if (!commitModeProperty.getValue()) {
getItem().resetCurrentEntry();
}
setGraphic(getItem().getViewBox());
}
@Override
public void updateItem(FolderCellType item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
setGraphic(item.getEditBox());
} else {
setGraphic(item.getViewBox());
if (getContextMenu() == null) {
setContextMenu(createContextMenu());
}
}
}
getTreeView().setEditable(false);
}
公共类FolderTreeCell扩展了TreeCell{
//CommitteIt中奇怪行为的解决方法..请参阅initTextFieldListener()
私有BooleanProperty commitModeProperty=newsimpleboleanproperty(false);
公共FolderTreeCell(){
assert Platform.isFxApplicationThread();
}
私有上下文菜单createContextMenu(){
MenuItem MenuItem=新MenuItem(“更改文件夹名称”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent evt){
getTreeView().setEditable(true);
getTreeView().edit(getTreeItem());
}
});
返回新的上下文菜单(菜单项);
}
私有void initTextFieldListener(){
getItem().textFieldProperty().get().setOnKeyReleased(新的EventHandler()){
@凌驾
公共无效句柄(KeyEvent evt){
if(evt.getCode()==KeyCode.ENTER){
CommittedIt(getItem());//当IsEdit()为true时,TODO调用updateItem(),导致调用cancelEdit()?!?!
}
}
});
}
@凌驾
public void committedit(FolderCellType newFolderCellType){
commitModeProperty.set(true);
super.committedit(newFolderCellType);
commitModeProperty.set(false);
}
@凌驾
公开作废已启动IT(){
super.startEdit();
setGraphic(getItem().getEditBox());
如果(getItem().textFieldProperty().get().getOnKeyReleased()==null){
initTextFieldListener();
}
getItem().textFieldProperty().get().selectAll();
getItem().textFieldProperty().get().requestFocus();
}
@凌驾
公共作废取消编辑(){
super.cancelEdit();
getTreeView().setEditable(false);
如果(!CommitModelProperty.getValue()){
getItem().resetCurrentEntry();
}
setGraphic(getItem().getViewBox());
}
@凌驾
public void updateItem(FolderCellType项,布尔值为空){
super.updateItem(项,空);
if(空| |项==null){
setText(空);
设置图形(空);
}否则{
if(isEditing()){
setGraphic(item.getEditBox());
}否则{
setGraphic(item.getViewBox());
如果(getContextMenu()==null){
setContextMenu(createContextMenu());
}
}
}
getTreeView().setEditable(false);
}
}