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 + -
显示快捷键?