📄 jxtreetable.java
字号:
* {@inheritDoc} */ public int getEditingRow() { return isHierarchical(editingColumn) ? -1 : editingRow; } /** * Returns the actual row that is editing as <code>getEditingRow</code> * will always return -1. */ private int realEditingRow() { return editingRow; } /** * Sets the data model for this JXTreeTable to the specified * {@link org.jdesktop.swingx.treetable.TreeTableModel}. The same data model * may be shared by any number of JXTreeTable instances. * * @param treeModel data model for this JXTreeTable */ public void setTreeTableModel(TreeTableModel treeModel) { renderer.setModel(treeModel); // #241: make sure old listeners are removed // JW: this should be done more cleanly, actually there is no need // to create a new adapter when setting a new treeModel. // what's needed is to fire a structureChanged ((TreeTableModelAdapter)getModel()).setTreeTableModel(treeModel); // Enforce referential integrity; bail on fail if (treeModel != renderer.getModel()) { // do not use assert here! throw new IllegalArgumentException("Mismatched TreeTableModel"); } // Install the default editor. setDefaultEditor(AbstractTreeTableModel.hierarchicalColumnClass, new TreeTableCellEditor(renderer)); // JTable supports row margins and intercell spacing, but JTree doesn't. // We must reconcile the differences in the semantics of rowHeight as // understood by JTable and JTree by overriding both setRowHeight() and // setRowMargin(); adminSetRowHeight(getRowHeight()); setRowMargin(getRowMargin()); // call overridden setRowMargin() } /** * Returns the underlying TreeTableModel for this JXTreeTable. * * @return the underlying TreeTableModel for this JXTreeTable */ public TreeTableModel getTreeTableModel() { return ((TreeTableModelAdapter) getModel()).getTreeTableModel(); } /** * <p>Overrides superclass version to make sure that the specified * {@link javax.swing.table.TableModel} is compatible with JXTreeTable before * invoking the inherited version.</p> * * <p>Because JXTreeTable internally adapts an * {@link org.jdesktop.swingx.treetable.TreeTableModel} to make it a compatible * TableModel, <b>this method should never be called directly</b>. Use * {@link #setTreeTableModel(org.jdesktop.swingx.treetable.TreeTableModel) setTreeTableModel} instead.</p> * * <p>While it is possible to obtain a reference to this adapted * version of the TableModel by calling {@link javax.swing.JTable#getModel()}, * any attempt to call setModel() with that adapter will fail because * the adapter might have been bound to a different JXTreeTable instance. If * you want to extract the underlying TreeTableModel, which, by the way, * <em>can</em> be shared, use {@link #getTreeTableModel() getTreeTableModel} * instead</p>. * * @param tableModel must be a TreeTableModelAdapter * @throws IllegalArgumentException if the specified tableModel is not an * instance of TreeTableModelAdapter */ public final void setModel(TableModel tableModel) { // note final keyword if (tableModel instanceof TreeTableModelAdapter) { if (((TreeTableModelAdapter) tableModel).getTreeTable() == null) { // Passing the above test ensures that this method is being // invoked either from JXTreeTable/JTable constructor or from // setTreeTableModel(TreeTableModel) super.setModel(tableModel); // invoke superclass version ((TreeTableModelAdapter) tableModel).bind(this); // permanently bound // Once a TreeTableModelAdapter is bound to any JXTreeTable instance, // invoking JXTreeTable.setModel() with that adapter will throw an // IllegalArgumentException, because we really want to make sure // that a TreeTableModelAdapter is NOT shared by another JXTreeTable. } else { throw new IllegalArgumentException("model already bound"); } } else { throw new IllegalArgumentException("unsupported model type"); } } /** * Throws UnsupportedOperationException because variable height rows are * not supported. * * @param row ignored * @param rowHeight ignored * @throws UnsupportedOperationException because variable height rows are * not supported */ public final void setRowHeight(int row, int rowHeight) { throw new UnsupportedOperationException("variable height rows not supported"); } /** * Sets the row height for this JXTreeTable. Reconciles semantic differences * between JTable and JTree regarding row height. * * @param rowHeight height of a row */ public void setRowHeight(int rowHeight) { super.setRowHeight(rowHeight); adjustTreeRowHeight(); // JTree doesn't have setRowMargin. So adjust. } /** * <p>Sets the margin between columns.</p> * * <p>If you set the column margin to zero, make sure that you also set * <code>showVerticalLines</code> to <code>false</code>.</p> * * @param columnMargin margin between columns; must be greater than or equal to zero. * @see #setShowVerticalLines(boolean) setShowVerticalLines */ public void setColumnMargin(int columnMargin) { super.setColumnMargin(columnMargin); } /** * <p>Overridden to ensure that private renderer state is kept in sync with the * state of the component. Calls the inherited version after performing the * necessary synchronization. If you override this method, make sure you call * this version from your version of this method.</p> * * <p>If you set row margin to zero, make sure that you also set * <code>showHorizontalLines</code> to <code>false</code>.</p> * * @param rowMargin margin or intercell spacing between rows * @see #setShowHorizontalLines(boolean) setShowHorizontalLines */ public void setRowMargin(int rowMargin) { // No need to override setIntercellSpacing, because the change in // rowMargin will be funneled through this method anyway. super.setRowMargin(rowMargin); adjustTreeRowHeight(); // JTree doesn't have setRowMargin. So adjust. } /** * Reconciles semantic differences between JTable and JTree regarding * row height. */ private void adjustTreeRowHeight() { final int treeRowHeight = rowHeight + (rowMargin << 1); if (renderer != null && renderer.getRowHeight() != treeRowHeight) { renderer.setRowHeight(treeRowHeight); } } /** * <p>Overridden to ensure that private renderer state is kept in sync with the * state of the component. Calls the inherited version after performing the * necessary synchronization. If you override this method, make sure you call * this version from your version of this method.</p> * * <p>This version maps the selection mode used by the renderer to match the * selection mode specified for the table. Specifically, the modes are mapped * as follows: * <pre> * ListSelectionModel.SINGLE_INTERVAL_SELECTION: TreeSelectionModel.CONTIGUOUS_TREE_SELECTION; * ListSelectionModel.MULTIPLE_INTERVAL_SELECTION: TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION; * any other (default): TreeSelectionModel.SINGLE_TREE_SELECTION; * </pre> * * {@inheritDoc} * * @param mode any of the table selection modes */ public void setSelectionMode(int mode) { if (renderer != null) { switch (mode) { case ListSelectionModel.SINGLE_INTERVAL_SELECTION: { renderer.getSelectionModel().setSelectionMode( TreeSelectionModel.CONTIGUOUS_TREE_SELECTION); break; } case ListSelectionModel.MULTIPLE_INTERVAL_SELECTION: { renderer.getSelectionModel().setSelectionMode( TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); break; } default: { renderer.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION); break; } } } super.setSelectionMode(mode); } /** * Overrides superclass version to provide support for cell decorators. * * @param renderer the <code>TableCellRenderer</code> to prepare * @param row the row of the cell to render, where 0 is the first row * @param column the column of the cell to render, where 0 is the first column * @return the <code>Component</code> used as a stamp to render the specified cell */ public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component component = super.prepareRenderer(renderer, row, column); // MUST ALWAYS ACCESS dataAdapter through accessor method!!! ComponentAdapter adapter = getComponentAdapter(); adapter.row = row; adapter.column = column; return applyRenderer(component, adapter); } /** * Performs necessary housekeeping before the renderer is actually applied. * * @param component * @param adapter component data adapter * @throws NullPointerException if the specified component or adapter is null */ protected Component applyRenderer(Component component, ComponentAdapter adapter) { if (component == null) { throw new IllegalArgumentException("null component"); } if (adapter == null) { throw new IllegalArgumentException("null component data adapter"); } if (isHierarchical(adapter.column)) { // After all decorators have been applied, make sure that relevant // attributes of the table cell renderer are applied to the // tree cell renderer before the hierarchical column is rendered! TreeCellRenderer tcr = renderer.getCellRenderer(); if (tcr instanceof JXTree.DelegatingRenderer) { tcr = ((JXTree.DelegatingRenderer) tcr).getDelegateRenderer(); } if (tcr instanceof DefaultTreeCellRenderer) { DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr); if (adapter.isSelected()) { dtcr.setTextSelectionColor(component.getForeground()); dtcr.setBackgroundSelectionColor(component.getBackground()); } else { dtcr.setTextNonSelectionColor(component.getForeground()); dtcr.setBackgroundNonSelectionColor(component.getBackground()); } } } return component; } /** * Sets the specified TreeCellRenderer as the Tree cell renderer. * * @param cellRenderer to use for rendering tree cells. */ public void setTreeCellRenderer(TreeCellRenderer cellRenderer) { if (renderer != null) { renderer.setCellRenderer(cellRenderer); } } public TreeCellRenderer getTreeCellRenderer() { return renderer.getCellRenderer(); } public String getToolTipText(MouseEvent event) { int column = columnAtPoint(event.getPoint()); if (isHierarchical(column)) { return renderer.getToolTipText(event); } return super.getToolTipText(event); } /** * Sets the specified icon as the icon to use for rendering collapsed nodes. * * @param icon to use for rendering collapsed nodes */ public void setCollapsedIcon(Icon icon) { renderer.setCollapsedIcon(icon); } /** * Sets the specified icon as the icon to use for rendering expanded nodes. * * @param icon to use for rendering expanded nodes */ public void setExpandedIcon(Icon icon) { renderer.setExpandedIcon(icon); } /** * Sets the specified icon as the icon to use for rendering open container nodes. * * @param icon to use for rendering open nodes */ public void setOpenIcon(Icon icon) { renderer.setOpenIcon(icon); } /** * Sets the specified icon as the icon to use for rendering closed container nodes. * * @param icon to use for rendering closed nodes */ public void setClosedIcon(Icon icon) { renderer.setClosedIcon(icon); } /** * Sets the specified icon as the icon to use for rendering leaf nodes. * * @param icon to use for rendering leaf nodes */ public void setLeafIcon(Icon icon) { renderer.setLeafIcon(icon); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -