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

📄 jtreetable.java

📁 一个结java树和表格的控件
💻 JAVA
字号:
import javax.swing.*;import javax.swing.event.*;import javax.swing.tree.*;import javax.swing.table.*;import java.awt.Dimension;import java.awt.Component;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.util.EventObject;public class JTreeTable extends JTable {	/** A subclass of JTree. */	protected TreeTableCellRenderer tree;	public JTreeTable(TreeTableModel treeTableModel) {		super();		// Create the tree. It will be used as a renderer and editor.		tree = new TreeTableCellRenderer(treeTableModel);		// 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(18);		}	}	public void updateUI() {		super.updateUI();		if (tree != null) {			tree.updateUI();		}		// Use the tree's default foreground and background colors in the		// table.		LookAndFeel.installColorsAndFont(this, "Tree.background",				"Tree.foreground", "Tree.font");	}	public int getEditingRow() {		return (getColumnClass(editingColumn) == TreeTableModel.class) ? -1				: editingRow;	}	public void setRowHeight(int rowHeight) {		super.setRowHeight(rowHeight);		if (tree != null && tree.getRowHeight() != rowHeight) {			tree.setRowHeight(getRowHeight());		}	}	public JTree getTree() {		return tree;	}	public class TreeTableCellRenderer extends JTree implements			TableCellRenderer {		/** Last table/tree row asked to renderer. */		protected int visibleRow;		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);		}		/**		 * TreeCellRenderer method. Overridden to update the visible row.		 */		public Component getTableCellRendererComponent(JTable table,				Object value, boolean isSelected, boolean hasFocus, int row,				int column) {			if (isSelected)				setBackground(table.getSelectionBackground());			else				setBackground(table.getBackground());			visibleRow = row;			return this;		}	}	public class TreeTableCellEditor extends AbstractCellEditor implements			TableCellEditor {		public Component getTableCellEditorComponent(JTable table,				Object value, boolean isSelected, int r, int c) {			return tree;		}		public boolean isCellEditable(EventObject e) {			if (e instanceof MouseEvent) {				for (int counter = getColumnCount() - 1; counter >= 0; counter--) {					if (getColumnClass(counter) == TreeTableModel.class) {						MouseEvent me = (MouseEvent) e;						MouseEvent newME = new MouseEvent(tree, me.getID(), me								.getWhen(), me.getModifiers(), me.getX()								- getCellRect(0, counter, true).x, me.getY(),								me.getClickCount(), me.isPopupTrigger());						tree.dispatchEvent(newME);						break;					}				}			}			return false;		}	}	class ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel {		/** Set to true when we are updating the ListSelectionModel. */		protected boolean updatingListSelectionModel;		public ListToTreeSelectionModelWrapper() {			super();			getListSelectionModel().addListSelectionListener(					createListSelectionListener());		}		ListSelectionModel getListSelectionModel() {			return listSelectionModel;		}		public void resetRowSelection() {			if (!updatingListSelectionModel) {				updatingListSelectionModel = true;				try {					super.resetRowSelection();				} finally {					updatingListSelectionModel = false;				}			}		}		protected ListSelectionListener createListSelectionListener() {			return new ListSelectionHandler();		}		protected void updateSelectedPathsFromSelectedRows() {			if (!updatingListSelectionModel) {				updatingListSelectionModel = true;				try {					// This is way expensive, ListSelectionModel needs an					// enumerator for iterating.					int min = listSelectionModel.getMinSelectionIndex();					int max = listSelectionModel.getMaxSelectionIndex();					clearSelection();					if (min != -1 && max != -1) {						for (int counter = min; counter <= max; counter++) {							if (listSelectionModel.isSelectedIndex(counter)) {								TreePath selPath = tree.getPathForRow(counter);								if (selPath != null) {									addSelectionPath(selPath);								}							}						}					}				} finally {					updatingListSelectionModel = false;				}			}		}		class ListSelectionHandler implements ListSelectionListener {			public void valueChanged(ListSelectionEvent e) {				updateSelectedPathsFromSelectedRows();			}		}	}}

⌨️ 快捷键说明

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