📄 basictableheaderui.java
字号:
mouseInputListener = createMouseInputListener(); header.addMouseListener(mouseInputListener); header.addMouseMotionListener(mouseInputListener); header.addFocusListener(focusListener); } /** * Register all keyboard actions on the JTableHeader. */ protected void installKeyboardActions() { InputMap keyMap = (InputMap)DefaultLookup.get(header, this, "TableHeader.ancestorInputMap"); SwingUtilities.replaceUIInputMap(header, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, keyMap); LazyActionMap.installLazyActionMap(header, BasicTableHeaderUI.class, "TableHeader.actionMap"); }// Uninstall methods public void uninstallUI(JComponent c) { uninstallDefaults(); uninstallListeners(); uninstallKeyboardActions(); header.remove(rendererPane); rendererPane = null; header = null; } protected void uninstallDefaults() {} protected void uninstallListeners() { header.removeMouseListener(mouseInputListener); header.removeMouseMotionListener(mouseInputListener); mouseInputListener = null; } /** * Unregisters default key actions. */ protected void uninstallKeyboardActions() { SwingUtilities.replaceUIInputMap(header, JComponent.WHEN_FOCUSED, null); SwingUtilities.replaceUIActionMap(header, null); } /** * Populates TableHeader's actions. */ static void loadActionMap(LazyActionMap map) { map.put(new Actions(Actions.TOGGLE_SORT_ORDER)); map.put(new Actions(Actions.SELECT_COLUMN_TO_LEFT)); map.put(new Actions(Actions.SELECT_COLUMN_TO_RIGHT)); map.put(new Actions(Actions.MOVE_COLUMN_LEFT)); map.put(new Actions(Actions.MOVE_COLUMN_RIGHT)); map.put(new Actions(Actions.RESIZE_LEFT)); map.put(new Actions(Actions.RESIZE_RIGHT)); map.put(new Actions(Actions.FOCUS_TABLE)); }//// Support for mouse rollover// /** * Returns the index of the column header over which the mouse * currently is. When the mouse is not over the table header, * -1 is returned. * * @see #rolloverColumnUpdated(int, int) * @return the index of the current rollover column * @since 1.6 */ protected int getRolloverColumn() { return rolloverColumn; } /** * This method gets called every time the rollover column in the table * header is updated. Every look and feel supporting rollover effect * in table header should override this method and repaint the header. * * @param oldColumn the index of the previous rollover column or -1 if the * mouse was not over a column * @param newColumn the index of the new rollover column or -1 if the mouse * is not over a column * @see #getRolloverColumn() * @see JTableHeader#getHeaderRect(int) * @since 1.6 */ protected void rolloverColumnUpdated(int oldColumn, int newColumn) { } private void updateRolloverColumn(MouseEvent e) { if (header.getDraggedColumn() == null && header.contains(e.getPoint())) { int col = header.columnAtPoint(e.getPoint()); if (col != rolloverColumn) { int oldRolloverColumn = rolloverColumn; rolloverColumn = col; rolloverColumnUpdated(oldRolloverColumn, rolloverColumn); } } }//// Support for keyboard and mouse access// private int selectNextColumn(boolean doIt) { int newIndex = getSelectedColumnIndex(); if (newIndex < header.getColumnModel().getColumnCount() - 1) { newIndex++; if (doIt) { selectColumn(newIndex); } } return newIndex; } private int selectPreviousColumn(boolean doIt) { int newIndex = getSelectedColumnIndex(); if (newIndex > 0) { newIndex--; if (doIt) { selectColumn(newIndex); } } return newIndex; } /** * Selects the specified column in the table header. Repaints the * affected header cells and makes sure the newly selected one is visible. */ void selectColumn(int newColIndex) { Rectangle repaintRect = header.getHeaderRect(selectedColumnIndex); header.repaint(repaintRect); selectedColumnIndex = newColIndex; repaintRect = header.getHeaderRect(newColIndex); header.repaint(repaintRect); scrollToColumn(newColIndex); return; } /** * Used by selectColumn to scroll horizontally, if necessary, * to ensure that the newly selected column is visible. */ private void scrollToColumn(int col) { Container container; JTable table; //Test whether the header is in a scroll pane and has a table. if ((header.getParent() == null) || ((container = header.getParent().getParent()) == null) || !(container instanceof JScrollPane) || ((table = header.getTable()) == null)) { return; } //Now scroll, if necessary. Rectangle vis = table.getVisibleRect(); Rectangle cellBounds = table.getCellRect(0, col, true); vis.x = cellBounds.x; vis.width = cellBounds.width; table.scrollRectToVisible(vis); } private int getSelectedColumnIndex() { int numCols = header.getColumnModel().getColumnCount(); if (selectedColumnIndex >= numCols && numCols > 0) { selectedColumnIndex = numCols - 1; } return selectedColumnIndex; } private static boolean canResize(TableColumn column, JTableHeader header) { return (column != null) && header.getResizingAllowed() && column.getResizable(); } private int changeColumnWidth(TableColumn resizingColumn, JTableHeader th, int oldWidth, int newWidth) { resizingColumn.setWidth(newWidth); Container container; JTable table; if ((th.getParent() == null) || ((container = th.getParent().getParent()) == null) || !(container instanceof JScrollPane) || ((table = th.getTable()) == null)) { return 0; } if (!container.getComponentOrientation().isLeftToRight() && !th.getComponentOrientation().isLeftToRight()) { JViewport viewport = ((JScrollPane)container).getViewport(); int viewportWidth = viewport.getWidth(); int diff = newWidth - oldWidth; int newHeaderWidth = table.getWidth() + diff; /* Resize a table */ Dimension tableSize = table.getSize(); tableSize.width += diff; table.setSize(tableSize); /* If this table is in AUTO_RESIZE_OFF mode and * has a horizontal scrollbar, we need to update * a view's position. */ if ((newHeaderWidth >= viewportWidth) && (table.getAutoResizeMode() == JTable.AUTO_RESIZE_OFF)) { Point p = viewport.getViewPosition(); p.x = Math.max(0, Math.min(newHeaderWidth - viewportWidth, p.x + diff)); viewport.setViewPosition(p); return diff; } } return 0; }//// Baseline// /** * Returns the baseline. * * @throws NullPointerException {@inheritDoc} * @throws IllegalArgumentException {@inheritDoc} * @see javax.swing.JComponent#getBaseline(int, int) * @since 1.6 */ public int getBaseline(JComponent c, int width, int height) { super.getBaseline(c, width, height); int baseline = -1; TableColumnModel columnModel = header.getColumnModel(); for(int column = 0; column < columnModel.getColumnCount(); column++) { TableColumn aColumn = columnModel.getColumn(column); Component comp = getHeaderRenderer(column); Dimension pref = comp.getPreferredSize(); int columnBaseline = comp.getBaseline(pref.width, height); if (columnBaseline >= 0) { if (baseline == -1) { baseline = columnBaseline; } else if (baseline != columnBaseline) { baseline = -1; break; } } } return baseline; }//// Paint Methods and support// public void paint(Graphics g, JComponent c) { if (header.getColumnModel().getColumnCount() <= 0) { return; } boolean ltr = header.getComponentOrientation().isLeftToRight(); Rectangle clip = g.getClipBounds(); Point left = clip.getLocation(); Point right = new Point( clip.x + clip.width - 1, clip.y ); TableColumnModel cm = header.getColumnModel(); int cMin = header.columnAtPoint( ltr ? left : right ); int cMax = header.columnAtPoint( ltr ? right : left ); // This should never happen. if (cMin == -1) { cMin = 0; } // If the table does not have enough columns to fill the view we'll get -1. // Replace this with the index of the last column. if (cMax == -1) { cMax = cm.getColumnCount()-1; } TableColumn draggedColumn = header.getDraggedColumn(); int columnWidth; Rectangle cellRect = header.getHeaderRect(ltr ? cMin : cMax); TableColumn aColumn; if (ltr) { for(int column = cMin; column <= cMax ; column++) { aColumn = cm.getColumn(column); columnWidth = aColumn.getWidth(); cellRect.width = columnWidth; if (aColumn != draggedColumn) { paintCell(g, cellRect, column); } cellRect.x += columnWidth; } } else { for(int column = cMax; column >= cMin; column--) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -