⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basictreeui.java

📁 JAVA 所有包
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	    cellEditor = newEditor;	    if(cellEditorListener == null)		cellEditorListener = createCellEditorListener();	    if(newEditor != null && cellEditorListener != null)		newEditor.addCellEditorListener(cellEditorListener);	    createdCellEditor = false;	}    }    /**      * Messaged from the tree we're in when the renderer has changed.      */    protected void updateRenderer() {	if(tree != null) {	    TreeCellRenderer      newCellRenderer;	    newCellRenderer = tree.getCellRenderer();	    if(newCellRenderer == null) {		tree.setCellRenderer(createDefaultCellRenderer());		createdRenderer = true;	    }	    else {		createdRenderer = false;		currentCellRenderer = newCellRenderer;		if(createdCellEditor) {		    tree.setCellEditor(null);		}	    }	}	else {	    createdRenderer = false;	    currentCellRenderer = null;	}	updateCellEditor();    }    /**     * Resets the TreeState instance based on the tree we're providing the     * look and feel for.     */    protected void configureLayoutCache() {	if(treeState != null && tree != null) {	    if(nodeDimensions == null)		nodeDimensions = createNodeDimensions();	    treeState.setNodeDimensions(nodeDimensions);	    treeState.setRootVisible(tree.isRootVisible());	    treeState.setRowHeight(tree.getRowHeight());	    treeState.setSelectionModel(getSelectionModel());	    // Only do this if necessary, may loss state if call with	    // same model as it currently has.	    if(treeState.getModel() != tree.getModel())		treeState.setModel(tree.getModel());	    updateLayoutCacheExpandedNodes();	    // Create a listener to update preferred size when bounds	    // changes, if necessary.	    if(isLargeModel()) {		if(componentListener == null) {		    componentListener = createComponentListener();		    if(componentListener != null)			tree.addComponentListener(componentListener);		}	    }	    else if(componentListener != null) {		tree.removeComponentListener(componentListener);		componentListener = null;	    }	}	else if(componentListener != null) {	    tree.removeComponentListener(componentListener);	    componentListener = null;	}    }    /**     * Marks the cached size as being invalid, and messages the     * tree with <code>treeDidChange</code>.     */    protected void updateSize() {	validCachedPreferredSize = false;	tree.treeDidChange();    }    private void updateSize0() {        validCachedPreferredSize = false;        tree.revalidate();    }    /**     * Updates the <code>preferredSize</code> instance variable,     * which is returned from <code>getPreferredSize()</code>.<p>     * For left to right orientations, the size is determined from the     * current AbstractLayoutCache. For RTL orientations, the preferred size     * becomes the width minus the minimum x position.     */    protected void updateCachedPreferredSize() {	if(treeState != null) {	    Insets               i = tree.getInsets();	    if(isLargeModel()) {		Rectangle            visRect = tree.getVisibleRect();                visRect.x -= i.left;                visRect.y -= i.top;                preferredSize.width = treeState.getPreferredWidth(visRect);	    }	    else {                preferredSize.width = treeState.getPreferredWidth(null);	    }	    preferredSize.height = treeState.getPreferredHeight();            preferredSize.width += i.left + i.right;            preferredSize.height += i.top + i.bottom;	}	validCachedPreferredSize = true;    }    /**      * Messaged from the VisibleTreeNode after it has been expanded.      */    protected void pathWasExpanded(TreePath path) {	if(tree != null) {	    tree.fireTreeExpanded(path);	}    }    /**      * Messaged from the VisibleTreeNode after it has collapsed.      */    protected void pathWasCollapsed(TreePath path) {	if(tree != null) {	    tree.fireTreeCollapsed(path);	}    }    /**      * Ensures that the rows identified by beginRow through endRow are      * visible.      */    protected void ensureRowsAreVisible(int beginRow, int endRow) {	if(tree != null && beginRow >= 0 && endRow < getRowCount(tree)) {            boolean scrollVert = DefaultLookup.getBoolean(tree, this,                              "Tree.scrollsHorizontallyAndVertically", false);	    if(beginRow == endRow) {		Rectangle     scrollBounds = getPathBounds(tree, getPathForRow							   (tree, beginRow));		if(scrollBounds != null) {                    if (!scrollVert) {                        scrollBounds.x = tree.getVisibleRect().x;                        scrollBounds.width = 1;                    }		    tree.scrollRectToVisible(scrollBounds);		}	    }	    else {		Rectangle   beginRect = getPathBounds(tree, getPathForRow						      (tree, beginRow));		Rectangle   visRect = tree.getVisibleRect();		Rectangle   testRect = beginRect;		int         beginY = beginRect.y;		int         maxY = beginY + visRect.height;		for(int counter = beginRow + 1; counter <= endRow; counter++) {		    testRect = getPathBounds(tree,					     getPathForRow(tree, counter));		    if((testRect.y + testRect.height) > maxY)			counter = endRow;		}		tree.scrollRectToVisible(new Rectangle(visRect.x, beginY, 1,						  testRect.y + testRect.height-						  beginY));	    }	}    }    /** Sets the preferred minimum size.      */    public void setPreferredMinSize(Dimension newSize) {	preferredMinSize = newSize;    }    /** Returns the minimum preferred size.      */    public Dimension getPreferredMinSize() {	if(preferredMinSize == null)	    return null;	return new Dimension(preferredMinSize);    }    /** Returns the preferred size to properly display the tree,      * this is a cover method for getPreferredSize(c, false).      */    public Dimension getPreferredSize(JComponent c) {	return getPreferredSize(c, true);    }    /** Returns the preferred size to represent the tree in      * <I>c</I>.  If <I>checkConsistancy</I> is true      * <b>checkConsistancy</b> is messaged first.      */    public Dimension getPreferredSize(JComponent c,				      boolean checkConsistancy) {	Dimension       pSize = this.getPreferredMinSize();	if(!validCachedPreferredSize)	    updateCachedPreferredSize();	if(tree != null) {	    if(pSize != null)		return new Dimension(Math.max(pSize.width,					      preferredSize.width),			      Math.max(pSize.height, preferredSize.height));	    return new Dimension(preferredSize.width, preferredSize.height);	}	else if(pSize != null)	    return pSize;	else	    return new Dimension(0, 0);    }    /**      * Returns the minimum size for this component.  Which will be      * the min preferred size or 0, 0.      */    public Dimension getMinimumSize(JComponent c) {	if(this.getPreferredMinSize() != null)	    return this.getPreferredMinSize();	return new Dimension(0, 0);    }    /**      * Returns the maximum size for this component, which will be the      * preferred size if the instance is currently in a JTree, or 0, 0.      */    public Dimension getMaximumSize(JComponent c) {	if(tree != null)	    return getPreferredSize(tree);	if(this.getPreferredMinSize() != null)	    return this.getPreferredMinSize();	return new Dimension(0, 0);    }    /**     * Messages to stop the editing session. If the UI the receiver     * is providing the look and feel for returns true from     * <code>getInvokesStopCellEditing</code>, stopCellEditing will     * invoked on the current editor. Then completeEditing will     * be messaged with false, true, false to cancel any lingering     * editing.     */    protected void completeEditing() {	/* If should invoke stopCellEditing, try that */	if(tree.getInvokesStopCellEditing() &&	   stopEditingInCompleteEditing && editingComponent != null) {	    cellEditor.stopCellEditing();	}	/* Invoke cancelCellEditing, this will do nothing if stopCellEditing	   was successful. */	completeEditing(false, true, false);    }    /**      * Stops the editing session.  If messageStop is true the editor      * is messaged with stopEditing, if messageCancel is true the      * editor is messaged with cancelEditing. If messageTree is true      * the treeModel is messaged with valueForPathChanged.      */    protected void completeEditing(boolean messageStop,				   boolean messageCancel,				   boolean messageTree) {	if(stopEditingInCompleteEditing && editingComponent != null) {	    Component             oldComponent = editingComponent;	    TreePath              oldPath = editingPath;	    TreeCellEditor        oldEditor = cellEditor;	    Object                newValue = oldEditor.getCellEditorValue();	    Rectangle             editingBounds = getPathBounds(tree, 								editingPath);	    boolean               requestFocus = (tree != null &&		                   (tree.hasFocus() || SwingUtilities.				    findFocusOwner(editingComponent) != null));	    editingComponent = null;	    editingPath = null;	    if(messageStop)		oldEditor.stopCellEditing();	    else if(messageCancel)		oldEditor.cancelCellEditing();	    tree.remove(oldComponent);	    if(editorHasDifferentSize) {		treeState.invalidatePathBounds(oldPath);		updateSize();	    }	    else {		editingBounds.x = 0;		editingBounds.width = tree.getSize().width;		tree.repaint(editingBounds);	    }	    if(requestFocus)		tree.requestFocus();	    if(messageTree)		treeModel.valueForPathChanged(oldPath, newValue);	}    }    // cover method for startEditing that allows us to pass extra    // information into that method via a class variable    private boolean startEditingOnRelease(TreePath path,                                          MouseEvent event,                                          MouseEvent releaseEvent) {        this.releaseEvent = releaseEvent;        try {            return startEditing(path, event);        } finally {            this.releaseEvent = null;        }    }    /**      * Will start editing for node if there is a cellEditor and      * shouldSelectCell returns true.<p>      * This assumes that path is valid and visible.      */    protected boolean startEditing(TreePath path, MouseEvent event) {        if (isEditing(tree) && tree.getInvokesStopCellEditing() &&                               !stopEditing(tree)) {            return false;        }	completeEditing();	if(cellEditor != null && tree.isPathEditable(path)) {	    int           row = getRowForPath(tree, path);	    if(cellEditor.isCellEditable(event)) {                editingComponent = cellEditor.getTreeCellEditorComponent		      (tree, path.getLastPathComponent(),		       tree.isPathSelected(path), tree.isExpanded(path),		       treeModel.isLeaf(path.getLastPathComponent()), row);		Rectangle           nodeBounds = getPathBounds(tree, path);		editingRow = row;		Dimension editorSize = editingComponent.getPreferredSize();		// Only allow odd heights if explicitly set.		if(editorSize.height != nodeBounds.height &&		   getRowHeight() > 0)		    editorSize.height = getRowHeight();		if(editorSize.width != nodeBounds.width ||		   editorSize.height != nodeBounds.height) {		    // Editor wants different width or height, invalidate 		    // treeState and relayout.		    editorHasDifferentSize = true;		    treeState.invalidatePathBounds(path);		    updateSize();		}		else		    editorHasDifferentSize = false;		tree.add(editingComponent);		editingComponent.setBounds(nodeBounds.x, nodeBounds.y,					   editorSize.width,					   editorSize.height);		editingPath = path;		editingComponent.validate();		Rectangle              visRect = tree.getVisibleRect();		tree.paintImmediately(nodeBounds.x, nodeBounds.y,				      visRect.width + visRect.x - nodeBounds.x,				      editorSize.height);		if(cellEditor.shouldSelectCell(event)) {		    stopEditingInCompleteEditing = false;		    try {			tree.setSelectionRow(row);		    } catch (Exception e) {			System.err.println("Editing exception: " + e);		    }		    stopEditingInCompleteEditing = true;		}		Component focusedComponent = SwingUtilities2.                                 compositeRequestFocus(editingComponent);                boolean selectAll = true;				if(event != null && event instanceof MouseEvent) {		    /* Find the component that will get forwarded all the		       mouse events until mouseReleased. */		    Point          componentPoint = SwingUtilities.convertPoint			(tree, new Point(event.getX(), event.getY()),			 editingComponent);		    /* Create an instance of BasicTreeMouseListener to handle		       passing the mouse/motion events to the necessary		       component. */		    // We really want similar behavior to getMouseEventTarget,		    // but it is package private.		    Component activeComponent = SwingUtilities.			            getDeepestComponentAt(editingComponent,				       componentPoint.x, componentPoint.y);		    if (activeComponent != null) {                        MouseInputHandler handler =                            new MouseInputHandler(tree, activeComponent,                                                  event, focusedComponent);                        if (releaseEvent != null) {                            handler.mouseReleased(releaseEvent);                        }                        selectAll = false;		    }		}                if (selectAll && focusedComponent instanceof JTextField) {                    ((JTextField)focusedComponent).selectAll();                }		return true;	    }	    else		editingComponent = null;	}	return false;    }    //    // Following are primarily for handling mouse events.    //    /**     * If the <code>mous

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -