jtreetable.java

来自「Semantic Web Ontology Editor」· Java 代码 · 共 571 行 · 第 1/2 页

JAVA
571
字号
/* * Copyright 1997-2000 by Sun Microsystems, Inc., * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A. * All rights reserved. * * This software is the confidential and proprietary information * of Sun Microsystems, Inc. ("Confidential Information").  You * shall not disclose such Confidential Information and shall use * it only in accordance with the terms of the license agreement * you entered into with Sun. */package org.mindswap.swoop.treetable;import java.awt.Color;import java.awt.Component;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Rectangle;import java.awt.event.InputEvent;import java.awt.event.MouseEvent;import java.util.EventObject;import javax.swing.DefaultCellEditor;import javax.swing.Icon;import javax.swing.JTable;import javax.swing.JTextField;import javax.swing.JTree;import javax.swing.ListSelectionModel;import javax.swing.LookAndFeel;import javax.swing.UIManager;import javax.swing.border.Border;import javax.swing.border.LineBorder;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;import javax.swing.table.TableCellRenderer;import javax.swing.tree.DefaultTreeCellRenderer;import javax.swing.tree.DefaultTreeSelectionModel;import javax.swing.tree.TreeCellRenderer;import javax.swing.tree.TreeModel;import javax.swing.tree.TreePath;import org.mindswap.swoop.change.TreeTableNode;import org.mindswap.swoop.utils.ui.SwoopIcons;/** * This example shows how to create a simple JTreeTable component, by using a * JTree as a renderer (and editor) for the cells in a particular column in the * JTable. *  * @version 1.2 10/27/98 *  * @author Philip Milne * @author Scott Violet */public class JTreeTable extends JTable {	/** A subclass of JTree. */	protected TreeTableCellRenderer tree;	//Aditya: adding this because we want to change the icons of the nodes	TreeCellRenderer treeCellRenderer = new DefaultTreeCellRenderer() {		public Component getTreeCellRendererComponent(			JTree tree,			Object value,			boolean sel,			boolean expanded,			boolean leaf,			int row,			boolean hasFocus) {			super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);			if (value instanceof TreeTableNode) {				TreeTableNode node = (TreeTableNode) value;				SwoopIcons icons = new SwoopIcons();				if (node.swoopChange.isRedundant) setIcon(icons.questionIcon);				else if (node.swoopChange.isTopNode) setIcon(icons.rootIcon);				else if (node.swoopChange.isOnRepository) setIcon(icons.explanationIcon);				else setIcon(icons.commentIcon);			}			return this;		}			};		public JTreeTable(TreeTableModel treeTableModel) {		super();		// Create the tree. It will be used as a renderer and editor.		tree = new TreeTableCellRenderer(treeTableModel);				//Aditya: adding a special purpose cell renderer		tree.setCellRenderer(treeCellRenderer);		// Install a tableModel representing the visible rows in the tree.		super.setModel(new TreeTableModelAdapter(treeTableModel, tree));		// Force the JTable and JTree to share their row selection models.		ListToTreeSelectionModelWrapper selectionWrapper = new ListToTreeSelectionModelWrapper();		tree.setSelectionModel(selectionWrapper);		setSelectionModel(selectionWrapper.getListSelectionModel());		// Install the tree editor renderer and editor.		setDefaultRenderer(TreeTableModel.class, tree);		setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());		// No grid.		setShowGrid(false);		// No intercell spacing		setIntercellSpacing(new Dimension(0, 0));		// And update the height of the trees row to match that of		// the table.		if (tree.getRowHeight() < 1) {			// Metal looks better like this.			setRowHeight(20);		} else			setRowHeight(tree.getRowHeight() + 3);	}	/**	 * Overridden to message super and forward the method to the tree. Since the	 * tree is not actually in the component hieachy it will never receive this	 * unless we forward it in this manner.	 */	public void updateUI() {		super.updateUI();		if (tree != null) {			tree.updateUI();			// Do this so that the editor is referencing the current renderer			// from the tree. The renderer can potentially change each time			// laf changes.			setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());		}		// Use the tree's default foreground and background colors in the		// table.		LookAndFeel.installColorsAndFont(this, "Tree.background",				"Tree.foreground", "Tree.font");	}	/**	 * Workaround for BasicTableUI anomaly. Make sure the UI never tries to	 * resize the editor. The UI currently uses different techniques to paint	 * the renderers and editors and overriding setBounds() below is not the	 * right thing to do for an editor. Returning -1 for the editing row in this	 * case, ensures the editor is never painted.	 */	public int getEditingRow() {		return (getColumnClass(editingColumn) == TreeTableModel.class) ? -1				: editingRow;	}	/**	 * Returns the actual row that is editing as <code>getEditingRow</code>	 * will always return -1.	 */	private int realEditingRow() {		return editingRow;	}	/**	 * This is overriden to invoke supers implementation, and then, if the	 * receiver is editing a Tree column, the editors bounds is reset. The	 * reason we have to do this is because JTable doesn't think the table is	 * being edited, as <code>getEditingRow</code> returns -1, and therefore	 * doesn't automaticly resize the editor for us.	 */	public void sizeColumnsToFit(int resizingColumn) {		super.sizeColumnsToFit(resizingColumn);		if (getEditingColumn() != -1				&& getColumnClass(editingColumn) == TreeTableModel.class) {			Rectangle cellRect = getCellRect(realEditingRow(),					getEditingColumn(), false);			Component component = getEditorComponent();			component.setBounds(cellRect);			component.validate();		}	}	/**	 * Overridden to pass the new rowHeight to the tree.	 */	public void setRowHeight(int rowHeight) {		super.setRowHeight(rowHeight);		if (tree != null && tree.getRowHeight() != rowHeight) {			tree.setRowHeight(getRowHeight());		}	}	/**	 * Returns the tree that is being shared between the model.	 */	public JTree getTree() {		return tree;	}	/**	 * Overriden to invoke repaint for the particular location if the column	 * contains the tree. This is done as the tree editor does not fill the	 * bounds of the cell, we need the renderer to paint the tree in the	 * background, and then draw the editor over it.	 */	public boolean editCellAt(int row, int column, EventObject e) {		boolean retValue = super.editCellAt(row, column, e);		if (retValue && getColumnClass(column) == TreeTableModel.class) {			repaint(getCellRect(row, column, false));		}		return retValue;	}	/**	 * A TreeCellRenderer that displays a JTree.	 */	public class TreeTableCellRenderer extends JTree implements			TableCellRenderer {		/** Last table/tree row asked to renderer. */		protected int visibleRow;		/**		 * Border to draw around the tree, if this is non-null, it will be		 * painted.		 */		protected Border highlightBorder;		public TreeTableCellRenderer(TreeModel model) {			super(model);		}		/**		 * updateUI is overridden to set the colors of the Tree's renderer to		 * match that of the table.		 */		public void updateUI() {			super.updateUI();			// Make the tree's cell renderer use the table's cell selection			// colors.			TreeCellRenderer tcr = getCellRenderer();			if (tcr instanceof DefaultTreeCellRenderer) {				DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr);				// For 1.1 uncomment this, 1.2 has a bug that will cause an				// exception to be thrown if the border selection color is				// null.				// dtcr.setBorderSelectionColor(null);				dtcr.setTextSelectionColor(UIManager						.getColor("Table.selectionForeground"));				dtcr.setBackgroundSelectionColor(UIManager						.getColor("Table.selectionBackground"));			}		}		/**		 * Sets the row height of the tree, and forwards the row height to the		 * table.		 */		public void setRowHeight(int rowHeight) {			if (rowHeight > 0) {				super.setRowHeight(rowHeight);				if (JTreeTable.this != null						&& JTreeTable.this.getRowHeight() != rowHeight) {					JTreeTable.this.setRowHeight(getRowHeight());				}			}		}		/**		 * This is overridden to set the height to match that of the JTable.		 */		public void setBounds(int x, int y, int w, int h) {			super.setBounds(x, 0, w, JTreeTable.this.getHeight());		}		/**		 * Sublcassed to translate the graphics such that the last visible row		 * will be drawn at 0,0.		 */		public void paint(Graphics g) {			g.translate(0, -visibleRow * getRowHeight());			super.paint(g);			// Draw the Table border if we have focus.			if (highlightBorder != null) {				highlightBorder.paintBorder(this, g, 0, visibleRow						* getRowHeight() - 1, getWidth(), getRowHeight() + 1);			}		}

⌨️ 快捷键说明

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