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 + -
显示快捷键?