📄 basictableheaderui.java
字号:
/* * @(#)BasicTableHeaderUI.java 1.77 06/07/28 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package javax.swing.plaf.basic;import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.plaf.*;import javax.swing.table.*;import sun.swing.*;/** * BasicTableHeaderUI implementation * * @version 1.77 07/28/06 * @author Alan Chung * @author Philip Milne */public class BasicTableHeaderUI extends TableHeaderUI { private static Cursor resizeCursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR); //// Instance Variables// /** The JTableHeader that is delegating the painting to this UI. */ protected JTableHeader header; protected CellRendererPane rendererPane; // Listeners that are attached to the JTable protected MouseInputListener mouseInputListener; // The column header over which the mouse currently is. private int rolloverColumn = -1; // The column that should be highlighted when the table header has the focus. private int selectedColumnIndex = 0; // Read ONLY via getSelectedColumnIndex! private static FocusListener focusListener = new FocusListener() { public void focusGained(FocusEvent e) { repaintHeader(e.getSource()); } public void focusLost(FocusEvent e) { repaintHeader(e.getSource()); } private void repaintHeader(Object source) { if (source instanceof JTableHeader) { JTableHeader th = (JTableHeader)source; BasicTableHeaderUI ui = (BasicTableHeaderUI)BasicLookAndFeel. getUIOfType(th.getUI(), BasicTableHeaderUI.class); if (ui == null) { return; } th.repaint(th.getHeaderRect(ui.getSelectedColumnIndex())); } } }; /** * This inner class is marked "public" due to a compiler bug. * This class should be treated as a "protected" inner class. * Instantiate it only within subclasses of BasicTableUI. */ public class MouseInputHandler implements MouseInputListener { private int mouseXOffset; private Cursor otherCursor = resizeCursor; public void mouseClicked(MouseEvent e) { if (e.getClickCount() % 2 == 1 && SwingUtilities.isLeftMouseButton(e)){ JTable table = header.getTable(); RowSorter sorter = table.getRowSorter(); if (sorter != null) { int columnIndex = header.columnAtPoint(e.getPoint()); if (columnIndex != -1) { columnIndex = table.convertColumnIndexToModel( columnIndex); sorter.toggleSortOrder(columnIndex); } } } } private TableColumn getResizingColumn(Point p) { return getResizingColumn(p, header.columnAtPoint(p)); } private TableColumn getResizingColumn(Point p, int column) { if (column == -1) { return null; } Rectangle r = header.getHeaderRect(column); r.grow(-3, 0); if (r.contains(p)) { return null; } int midPoint = r.x + r.width/2; int columnIndex; if( header.getComponentOrientation().isLeftToRight() ) { columnIndex = (p.x < midPoint) ? column - 1 : column; } else { columnIndex = (p.x < midPoint) ? column : column - 1; } if (columnIndex == -1) { return null; } return header.getColumnModel().getColumn(columnIndex); } public void mousePressed(MouseEvent e) { header.setDraggedColumn(null); header.setResizingColumn(null); header.setDraggedDistance(0); Point p = e.getPoint(); // First find which header cell was hit TableColumnModel columnModel = header.getColumnModel(); int index = header.columnAtPoint(p); if (index != -1) { // The last 3 pixels + 3 pixels of next column are for resizing TableColumn resizingColumn = getResizingColumn(p, index); if (canResize(resizingColumn, header)) { header.setResizingColumn(resizingColumn); if( header.getComponentOrientation().isLeftToRight() ) { mouseXOffset = p.x - resizingColumn.getWidth(); } else { mouseXOffset = p.x + resizingColumn.getWidth(); } } else if (header.getReorderingAllowed()) { TableColumn hitColumn = columnModel.getColumn(index); header.setDraggedColumn(hitColumn); mouseXOffset = p.x; } } if (header.getReorderingAllowed()) { int oldRolloverColumn = rolloverColumn; rolloverColumn = -1; rolloverColumnUpdated(oldRolloverColumn, rolloverColumn); } } private void swapCursor() { Cursor tmp = header.getCursor(); header.setCursor(otherCursor); otherCursor = tmp; } public void mouseMoved(MouseEvent e) { if (canResize(getResizingColumn(e.getPoint()), header) != (header.getCursor() == resizeCursor)) { swapCursor(); } updateRolloverColumn(e); } public void mouseDragged(MouseEvent e) { int mouseX = e.getX(); TableColumn resizingColumn = header.getResizingColumn(); TableColumn draggedColumn = header.getDraggedColumn(); boolean headerLeftToRight = header.getComponentOrientation().isLeftToRight(); if (resizingColumn != null) { int oldWidth = resizingColumn.getWidth(); int newWidth; if (headerLeftToRight) { newWidth = mouseX - mouseXOffset; } else { newWidth = mouseXOffset - mouseX; } mouseXOffset += changeColumnWidth(resizingColumn, header, oldWidth, newWidth); } else if (draggedColumn != null) { TableColumnModel cm = header.getColumnModel(); int draggedDistance = mouseX - mouseXOffset; int direction = (draggedDistance < 0) ? -1 : 1; int columnIndex = viewIndexForColumn(draggedColumn); int newColumnIndex = columnIndex + (headerLeftToRight ? direction : -direction); if (0 <= newColumnIndex && newColumnIndex < cm.getColumnCount()) { int width = cm.getColumn(newColumnIndex).getWidth(); if (Math.abs(draggedDistance) > (width / 2)) { JTable table = header.getTable(); mouseXOffset = mouseXOffset + direction * width; header.setDraggedDistance(draggedDistance - direction * width); //Cache the selected column. int selectedIndex = table.convertColumnIndexToModel( getSelectedColumnIndex()); //Now do the move. cm.moveColumn(columnIndex, newColumnIndex); //Update the selected index. selectColumn(table.convertColumnIndexToView(selectedIndex)); return; } } setDraggedDistance(draggedDistance, columnIndex); } updateRolloverColumn(e); } public void mouseReleased(MouseEvent e) { setDraggedDistance(0, viewIndexForColumn(header.getDraggedColumn())); header.setResizingColumn(null); header.setDraggedColumn(null); updateRolloverColumn(e); } public void mouseEntered(MouseEvent e) { updateRolloverColumn(e); } public void mouseExited(MouseEvent e) { int oldRolloverColumn = rolloverColumn; rolloverColumn = -1; rolloverColumnUpdated(oldRolloverColumn, rolloverColumn); }//// Protected & Private Methods// private void setDraggedDistance(int draggedDistance, int column) { header.setDraggedDistance(draggedDistance); if (column != -1) { header.getColumnModel().moveColumn(column, column); } } }//// Factory methods for the Listeners// /** * Creates the mouse listener for the JTableHeader. */ protected MouseInputListener createMouseInputListener() { return new MouseInputHandler(); } //// The installation/uninstall procedures and support// public static ComponentUI createUI(JComponent h) { return new BasicTableHeaderUI(); }// Installation public void installUI(JComponent c) { header = (JTableHeader)c; rendererPane = new CellRendererPane(); header.add(rendererPane); installDefaults(); installListeners(); installKeyboardActions(); } /** * Initialize JTableHeader properties, e.g. font, foreground, and background. * The font, foreground, and background properties are only set if their * current value is either null or a UIResource, other properties are set * if the current value is null. * * @see #installUI */ protected void installDefaults() { LookAndFeel.installColorsAndFont(header, "TableHeader.background", "TableHeader.foreground", "TableHeader.font"); LookAndFeel.installProperty(header, "opaque", Boolean.TRUE); } /** * Attaches listeners to the JTableHeader. */ protected void installListeners() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -