/** * Installs the table. <p> * This implemenation synchs enabled state and installs the PropertyChangeListener. */ protected void installTable() { updateEnabledFromTable(); if (getTable() == null) return; getTable().addPropertyChangeListener(getTablePropertyChangeListener()); }
/** * * {@inheritDoc} * <p> * * Overridden to return a <code>JXTableHeader</code>. * * @see JXTableHeader */ @Override protected JTableHeader createDefaultTableHeader() { return new JXTableHeader(columnModel); }
/** * Creates and installs header listeners to service the extended functionality. * This implementation creates and installs a custom mouse input listener. */ protected void installHeaderListener() { if (headerListener == null) { headerListener = new HeaderListener(); addMouseListener(headerListener); addMouseMotionListener(headerListener); } }
/** * Sets the resortsOnDoubleClick property. If enabled, the second click * of a mouseClicked event will toggle the sort order again if the * column has been unsorted before. This is introduced to support * feature request #271-swingx. It is effective only if the coupled table * is of type JXTable and has full control about its RowSorter's properties. * * The default value is false. * * @param resortsOnDoubleClick a boolean indicating whether or not the * second click in a mouseClicked event should resort the column. * * @see #getResortsOnDoubleClick() */ public void setResortsOnDoubleClick(boolean resortsOnDoubleClick) { boolean old = getResortsOnDoubleClick(); this.resortsOnDoubleClick = resortsOnDoubleClick; firePropertyChange("resortsOnDoubleClick", old, getResortsOnDoubleClick()); }
/** * Sets the SortGestureRecognizer to use for interpreting mouse events * as sort gestures. If null, a default as returned by createSortGestureRecognizer * is used.<p> * * This is a bound property. * * @param recognizer the SortGestureRecognizer to use for interpreting mouse events * as sort gestures * * @see #getSortGestureRecognizer() * @see #createSortGestureRecognizer() */ public void setSortGestureRecognizer(SortGestureRecognizer recognizer) { SortGestureRecognizer old = getSortGestureRecognizer(); this.sortGestureRecognizer = recognizer; firePropertyChange("sortGestureRecognizer", old, getSortGestureRecognizer()); }
/** * {@inheritDoc} <p> * * Overridden to scroll the table to keep the dragged column visible. * This side-effect is enabled only if the header's autoscroll property is * <code>true</code> and the associated table is of type JXTable.<p> * * The autoscrolls is disabled by default. With or without - core * issue #6503981 has weird effects (for jdk 1.6 - 1.6u3) on a plain * JTable as well as a JXTable, fixed in 1.6u4. * */ @Override public void setDraggedDistance(int distance) { int old = getDraggedDistance(); super.setDraggedDistance(distance); // fire because super doesn't firePropertyChange("draggedDistance", old, getDraggedDistance()); if (!getAutoscrolls() || (getXTable() == null)) return; TableColumn column = getDraggedColumn(); // fix for #788-swingx: don't try to scroll if we have no dragged column // as doing will confuse the horizontalScrollEnabled on the JXTable. if (column != null) { getXTable().scrollColumnToVisible(getViewIndexForColumn(column)); } }
/** * Returns the column tooltip of the column at the position * of the MouseEvent, if a tooltip is available. * * @param event the mouseEvent representing the mouse location. * @return the column tooltip of the column below the mouse location, * or null if not available. */ protected String getColumnToolTipText(MouseEvent event) { if (getXTable() == null) return null; int column = columnAtPoint(event.getPoint()); if (column < 0) return null; TableColumnExt columnExt = getXTable().getColumnExt(column); return columnExt != null ? columnExt.getToolTipText() : null; }
/** * Returns a reasonable minimal preferred height for the header. This is * meant as a last straw if all header values are null, renderers report 0 as * their preferred height.<p> * * This implementation returns the default header renderer's preferred height as measured * with a dummy value if the input height is 0, otherwise returns the height * unchanged. * * @param height the initial height. * @return a reasonable minimal preferred height. * * @see #getPreferredSize() * @see #getPreferredSize(Dimension) */ protected int getMinimumHeight(int height) { if ((height == 0)) { // && (getXTable() != null) // && getXTable().isColumnControlVisible()){ TableCellRenderer renderer = getDefaultRenderer(); Component comp = renderer.getTableCellRendererComponent(getTable(), "dummy", false, false, -1, -1); height = comp.getPreferredSize().height; } return height; }
/** * Returns the TableCellRenderer to use for the column with the given index. This * implementation returns the column's header renderer if available or this header's * default renderer if not. * * @param columnIndex the index in view coordinates of the column * @return the renderer to use for the column, guaranteed to be not null. */ public TableCellRenderer getCellRenderer(int columnIndex) { TableCellRenderer renderer = getColumnModel().getColumn(columnIndex).getHeaderRenderer(); return renderer != null ? renderer : getDefaultRenderer(); }
/** * Returns a preferred size which is adjusted to the maximum of all * header renderers' height requirement. * * @param pref an initial preferred size * @return the initial preferred size with its height property adjusted * to the maximum of all renderers preferred height requirement. * * @see #getPreferredSize() * @see #getMinimumHeight(int) */ protected Dimension getPreferredSize(Dimension pref) { int height = pref.height; for (int i = 0; i < getColumnModel().getColumnCount(); i++) { TableCellRenderer renderer = getCellRenderer(i); Component comp = renderer.getTableCellRendererComponent(table, getColumnModel().getColumn(i).getHeaderValue(), false, false, -1, i); height = Math.max(height, comp.getPreferredSize().height); } pref.height = height; return pref; }
/** * Uninstalls the table. <p> * This implementation uninstalls the PropertyChangeListener. */ protected void uninstallTable() { if (getTable() == null) return; getTable().removePropertyChangeListener(getTablePropertyChangeListener()); }
/** * Synchs the header's enabled with the table's enabled property. */ protected void updateEnabledFromTable() { setEnabled(getTable() != null ? getTable().isEnabled() : true); }
/** * @inherited <p> * * Overridden to fire a propertyChange for draggedColumn. */ @Override public void setDraggedColumn(TableColumn column) { if (getDraggedColumn() == column) return; TableColumn old = getDraggedColumn(); super.setDraggedColumn(column); firePropertyChange("draggedColumn", old, getDraggedColumn()); }
/** * @inherited <p> * * Overridden to fire a propertyChange for resizingColumn. */ @Override public void setResizingColumn(TableColumn aColumn) { if (getResizingColumn() == aColumn) return; TableColumn old = getResizingColumn(); super.setResizingColumn(aColumn); firePropertyChange("resizingColumn", old, getResizingColumn()); }
final JTable table = new JXTable(new AncientSwingTeam()); table.setRowSorter(new MyTableRowSorter(table.getModel())); Action toggle = new AbstractAction("toggleSort") { @Override public void actionPerformed(ActionEvent e) { JXTableHeader header = SwingXUtilities.getAncestor( JXTableHeader.class, (Component) e.getSource()); Point trigger = header.getPopupTriggerLocation(); int column = trigger != null ? header.columnAtPoint(trigger) : -1; if (column < 0) return; int modelColumn = header.getTable().convertColumnIndexToModel(column); ((MyTableRowSorter) header.getTable().getRowSorter()) .realToggleSortOrder(modelColumn); } }; JPopupMenu menu = new JPopupMenu(); menu.add(toggle); table.getTableHeader().setComponentPopupMenu(menu);
private void doSort(MouseEvent e) { JXTable table = getXTable(); if (!table.isSortable()) return; if (getSortGestureRecognizer().isResetSortOrderGesture(e)) { table.resetSortOrder(); repaint(); } else if (getSortGestureRecognizer().isToggleSortOrderGesture(e)){ int column = columnAtPoint(e.getPoint()); if (column >= 0) { table.toggleSortOrder(column); } uncacheResizingColumn(); repaint(); } }
/** * {@inheritDoc} <p> * * Overridden to respect the column tooltip, if available. * * @return the column tooltip of the column at the mouse position * if not null or super if not available. */ @Override public String getToolTipText(MouseEvent event) { String columnToolTipText = getColumnToolTipText(event); return columnToolTipText != null ? columnToolTipText : super.getToolTipText(event); }
/** * Returns the (visible) view index for the table column * or -1 if not visible or not contained in this header's * columnModel. * * * @param aColumn the TableColumn to find the view index for * @return the view index of the given table column or -1 if not visible * or not contained in the column model. */ private int getViewIndexForColumn(TableColumn aColumn) { if (aColumn == null) return -1; TableColumnModel cm = getColumnModel(); for (int column = 0; column < cm.getColumnCount(); column++) { if (cm.getColumn(column) == aColumn) { return column; } } return -1; }
/** * {@inheritDoc} <p> * * Overridden to scroll the table to keep the dragged column visible. * This side-effect is enabled only if the header's autoscroll property is * <code>true</code> and the associated table is of type JXTable.<p> * * The autoscrolls is disabled by default. With or without - core * issue #6503981 has weird effects (for jdk 1.6 - 1.6u3) on a plain * JTable as well as a JXTable, fixed in 1.6u4. * */ @Override public void setDraggedDistance(int distance) { int old = getDraggedDistance(); super.setDraggedDistance(distance); // fire because super doesn't firePropertyChange("draggedDistance", old, getDraggedDistance()); if (!getAutoscrolls() || (getXTable() == null)) return; TableColumn column = getDraggedColumn(); // fix for #788-swingx: don't try to scroll if we have no dragged column // as doing will confuse the horizontalScrollEnabled on the JXTable. if (column != null) { getXTable().scrollColumnToVisible(getViewIndexForColumn(column)); } }