basictableheaderui.java
来自「linux下建立JAVA虚拟机的源码KAFFE」· Java 代码 · 共 569 行 · 第 1/2 页
JAVA
569 行
boolean onBoundary = false; int x = e.getX(); int p = 0; int col = - 1; Scan: for (int i = 0; i < n; i++) { p += model.getColumn(i).getWidth(); if (p > x) { col = i; break Scan; } } if (col < 0) return; TableColumn dragIt = model.getColumn(col); header.setDraggedColumn(dragIt); draggingFrom = (p - dragIt.getWidth()) - x; draggingHeaderRect = new Rectangle(header.getHeaderRect(col)); draggingColumnNumber = col; } } /** * Set all column preferred width to the current width to prevend abrupt * width changes during the next resize. */ public void mouseReleased(MouseEvent e) { if (header.getResizingColumn() != null && header.getResizingAllowed()) endResizing(); if (header.getDraggedColumn() != null && header.getReorderingAllowed()) endDragging(e); } /** * Stop resizing session. */ void endResizing() { TableColumnModel model = header.getColumnModel(); int n = model.getColumnCount(); if (n > 2) { TableColumn c; for (int i = 0; i < n; i++) { c = model.getColumn(i); c.setPreferredWidth(c.getWidth()); } } header.setResizingColumn(null); showingResizeCursor = false; if (timer != null) timer.stop(); header.setCursor(Cursor.getDefaultCursor()); } /** * Stop the dragging session. * * @param e the "mouse release" mouse event, needed to determing the final * location for the dragged column. */ void endDragging(MouseEvent e) { header.setDraggedColumn(null); // Return if the mouse have left the header area while pressed. if (e == null) { header.repaint(draggingHeaderRect); draggingHeaderRect = null; return; } else draggingHeaderRect = null; TableColumnModel model = header.getColumnModel(); // Find where have we dragged the column. int x = e.getX(); int p = 0; int col = - 1; int n = model.getColumnCount(); Scan: for (int i = 0; i < n; i++) { p += model.getColumn(i).getWidth(); if (p > x) { col = i; break Scan; } } if (col >= 0) header.getTable().moveColumn(draggingColumnNumber, col); } } /** * Create and return the mouse input listener. * * @return the mouse listener ({@link MouseInputHandler}, if not overridden. */ protected MouseInputListener createMouseInputListener() { return new MouseInputHandler(); } /** * Construct a new BasicTableHeaderUI, create mouse listeners. */ public BasicTableHeaderUI() { mouseInputListener = createMouseInputListener(); } protected void installDefaults() { LookAndFeel.installColorsAndFont(header, "TableHeader.background", "TableHeader.foreground", "TableHeader.font"); cellBorder = UIManager.getBorder("TableHeader.cellBorder"); } protected void installKeyboardActions() { // TODO: Implement this properly. } /** * Add the mouse listener and the mouse motion listener to the table * header. The listeners support table column resizing and rearrangement * by mouse. */ protected void installListeners() { header.addMouseListener(mouseInputListener); header.addMouseMotionListener(mouseInputListener); } public void installUI(JComponent c) { header = (JTableHeader) c; rendererPane = new CellRendererPane(); installDefaults(); installKeyboardActions(); installListeners(); } protected void uninstallDefaults() { header.setBackground(null); header.setForeground(null); header.setFont(null); } protected void uninstallKeyboardActions() { // TODO: Implement this properly. } /** * Remove the previously installed listeners. */ protected void uninstallListeners() { header.removeMouseListener(mouseInputListener); header.removeMouseMotionListener(mouseInputListener); } public void uninstallUI(JComponent c) { uninstallListeners(); uninstallKeyboardActions(); uninstallDefaults(); } /** * Repaint the table header. */ public void paint(Graphics gfx, JComponent c) { TableColumnModel cmod = header.getColumnModel(); int ncols = cmod.getColumnCount(); if (ncols == 0) return; Rectangle clip = gfx.getClipBounds(); TableCellRenderer defaultRend = header.getDefaultRenderer(); for (int i = 0; i < ncols; ++i) { Rectangle bounds = header.getHeaderRect(i); if (bounds.intersects(clip)) { Rectangle oldClip = gfx.getClipBounds(); TableColumn col = cmod.getColumn(i); TableCellRenderer rend = col.getHeaderRenderer(); if (rend == null) rend = defaultRend; Object val = col.getHeaderValue(); Component comp = rend.getTableCellRendererComponent(header.getTable(), val, false, // isSelected false, // isFocused -1, i); // FIXME: The following settings should be performed in // rend.getTableCellRendererComponent(). comp.setFont(header.getFont()); comp.setBackground(header.getBackground()); comp.setForeground(header.getForeground()); if (comp instanceof JComponent) ((JComponent)comp).setBorder(cellBorder); rendererPane.paintComponent(gfx, comp, header, bounds.x, bounds.y, bounds.width, bounds.height); } } // This displays a running rectangle that is much simplier than the total // animation, as it is seen in Sun's application. // TODO animate the collumn dragging like in Sun's jre. if (draggingHeaderRect!=null) { gfx.setColor(header.getForeground()); gfx.drawRect(draggingHeaderRect.x, draggingHeaderRect.y+2, draggingHeaderRect.width-1, draggingHeaderRect.height-6); } } /** * Get the preferred header size. * * @param ignored unused * * @return the preferred size of the associated header. */ public Dimension getPreferredSize(JComponent ignored) { TableColumnModel cmod = header.getColumnModel(); TableCellRenderer defaultRend = header.getDefaultRenderer(); int ncols = cmod.getColumnCount(); Dimension ret = new Dimension(0,0); int spacing = 0; if (header.getTable() != null && header.getTable().getIntercellSpacing() != null) spacing = header.getTable().getIntercellSpacing().width; for (int i = 0; i < ncols; ++i) { TableColumn col = cmod.getColumn(i); TableCellRenderer rend = col.getHeaderRenderer(); if (rend == null) rend = defaultRend; Object val = col.getHeaderValue(); Component comp = rend.getTableCellRendererComponent(header.getTable(), val, false, // isSelected false, // isFocused -1, i); comp.setFont(header.getFont()); comp.setBackground(header.getBackground()); comp.setForeground(header.getForeground()); if (comp instanceof JComponent) ((JComponent)comp).setBorder(cellBorder); Dimension d = comp.getPreferredSize(); ret.width += spacing; ret.height = Math.max(d.height, ret.height); } ret.width = cmod.getTotalColumnWidth(); return ret; } }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?