synthtableui.java

来自「java jdk 1.4的源码」· Java 代码 · 共 1,411 行 · 第 1/4 页

JAVA
1,411
字号
    }    private int viewIndexForColumn(TableColumn aColumn) {        TableColumnModel cm = table.getColumnModel();        for (int column = 0; column < cm.getColumnCount(); column++) {            if (cm.getColumn(column) == aColumn) {                return column;            }        }        return -1;    }    private void paintCells(SynthContext context, Graphics g, int rMin,                            int rMax, int cMin, int cMax) {	JTableHeader header = table.getTableHeader();	TableColumn draggedColumn = (header == null) ? null : header.getDraggedColumn();	TableColumnModel cm = table.getColumnModel();	int columnMargin = cm.getColumnMargin();        Rectangle cellRect;	TableColumn aColumn;	int columnWidth;	if (table.getComponentOrientation().isLeftToRight()) {	    for(int row = rMin; row <= rMax; row++) {		cellRect = table.getCellRect(row, cMin, false);                for(int column = cMin; column <= cMax; column++) {                    aColumn = cm.getColumn(column);                    columnWidth = aColumn.getWidth();                    cellRect.width = columnWidth - columnMargin;                    if (aColumn != draggedColumn) {                        paintCell(g, cellRect, row, column);                    }                    cellRect.x += columnWidth;        	}	    }	} else {	    for(int row = rMin; row <= rMax; row++) {                cellRect = table.getCellRect(row, cMin, false);                aColumn = cm.getColumn(cMin);                if (aColumn != draggedColumn) {                    columnWidth = aColumn.getWidth();                    cellRect.width = columnWidth - columnMargin;                    paintCell(g, cellRect, row, cMin);                }                for(int column = cMin+1; column <= cMax; column++) {                    aColumn = cm.getColumn(column);                    columnWidth = aColumn.getWidth();                    cellRect.width = columnWidth - columnMargin;                    cellRect.x -= columnWidth;                    if (aColumn != draggedColumn) {                        paintCell(g, cellRect, row, column);                    }        	}	    }	}        // Paint the dragged column if we are dragging.        if (draggedColumn != null) {	    paintDraggedArea(context, g, rMin, rMax, draggedColumn, header.getDraggedDistance());	}	// Remove any renderers that may be left in the rendererPane.	rendererPane.removeAll();    }    private void paintDraggedArea(SynthContext context, Graphics g, int rMin, int rMax, TableColumn draggedColumn, int distance) {        int draggedColumnIndex = viewIndexForColumn(draggedColumn);        Rectangle minCell = table.getCellRect(rMin, draggedColumnIndex, true);	Rectangle maxCell = table.getCellRect(rMax, draggedColumnIndex, true);	Rectangle vacatedColumnRect = minCell.union(maxCell);	// Paint a gray well in place of the moving column.	g.setColor(table.getParent().getBackground());	g.fillRect(vacatedColumnRect.x, vacatedColumnRect.y,		   vacatedColumnRect.width, vacatedColumnRect.height);	// Move to the where the cell has been dragged.	vacatedColumnRect.x += distance;	// Fill the background.	g.setColor(context.getStyle().getColor(context, ColorType.BACKGROUND));	g.fillRect(vacatedColumnRect.x, vacatedColumnRect.y,		   vacatedColumnRect.width, vacatedColumnRect.height);        SynthGraphics synthG = context.getStyle().getSynthGraphics(context);        	// Paint the vertical grid lines if necessary.	if (table.getShowVerticalLines()) {	    g.setColor(table.getGridColor());	    int x1 = vacatedColumnRect.x;	    int y1 = vacatedColumnRect.y;	    int x2 = x1 + vacatedColumnRect.width - 1;	    int y2 = y1 + vacatedColumnRect.height - 1;	    // Left            synthG.drawLine(context, "Table.grid", g, x1-1, y1, x1-1, y2);	    // Right	    synthG.drawLine(context, "Table.grid", g, x2, y1, x2, y2);	}	for(int row = rMin; row <= rMax; row++) {	    // Render the cell value	    Rectangle r = table.getCellRect(row, draggedColumnIndex, false);	    r.x += distance;	    paintCell(g, r, row, draggedColumnIndex);	    // Paint the (lower) horizontal grid line if necessary.	    if (table.getShowHorizontalLines()) {		g.setColor(table.getGridColor());		Rectangle rcr = table.getCellRect(row, draggedColumnIndex, true);		rcr.x += distance;		int x1 = rcr.x;		int y1 = rcr.y;		int x2 = x1 + rcr.width - 1;		int y2 = y1 + rcr.height - 1;		synthG.drawLine(context, "Table.grid", g, x1, y2, x2, y2);	    }	}    }    private void paintCell(Graphics g, Rectangle cellRect, int row, int column) {        if (table.isEditing() && table.getEditingRow()==row &&                                 table.getEditingColumn()==column) {            Component component = table.getEditorComponent();	    component.setBounds(cellRect);            component.validate();        }        else {            TableCellRenderer renderer = table.getCellRenderer(row, column);            Component component = table.prepareRenderer(renderer, row, column);            rendererPane.paintComponent(g, component, table, cellRect.x, cellRect.y,                                        cellRect.width, cellRect.height, true);        }    }    private static final TableDragGestureRecognizer defaultDragRecognizer = new TableDragGestureRecognizer();    /**     * Drag gesture recognizer for JTable components     */    static class TableDragGestureRecognizer extends SynthDragGestureRecognizer {        /**         * Determines if the following are true:         * <ul>         * <li>the press event is located over a selection         * <li>the dragEnabled property is true         * <li>A TranferHandler is installed         * </ul>         * <p>         * This is implemented to perform the superclass behavior         * followed by a check if the dragEnabled         * property is set and if the location picked is selected.         */        protected boolean isDragPossible(MouseEvent e) {            if (super.isDragPossible(e)) {                JTable table = (JTable) this.getComponent(e);                if (table.getDragEnabled()) {                    Point p = e.getPoint();                    int row = table.rowAtPoint(p);                    int column = table.columnAtPoint(p);                    if ((column != -1) && (row != -1) && table.isCellSelected(row, column)) {                        return true;                    }                }            }            return false;        }    }    private static DropTargetListener defaultDropTargetListener = null;    /**     * A DropTargetListener to extend the default Swing handling of drop operations     * by moving the tree selection to the nearest location to the mouse pointer.     * Also adds autoscroll capability.     */    static class TableDropTargetListener extends SynthDropTargetListener {        /**         * called to save the state of a component in case it needs to         * be restored because a drop is not performed.         */        protected void saveComponentState(JComponent comp) {            JTable table = (JTable) comp;            rows = table.getSelectedRows();            cols = table.getSelectedColumns();        }        /**         * called to restore the state of a component         * because a drop was not performed.         */        protected void restoreComponentState(JComponent comp) {            JTable table = (JTable) comp;            table.clearSelection();            for (int i = 0; i < rows.length; i++) {                table.addRowSelectionInterval(rows[i], rows[i]);            }            for (int i = 0; i < cols.length; i++) {                table.addColumnSelectionInterval(cols[i], cols[i]);            }        }        /**         * called to set the insertion location to match the current         * mouse pointer coordinates.         */        protected void updateInsertionLocation(JComponent comp, Point p) {            JTable table = (JTable) comp;            int row = table.rowAtPoint(p);            int col = table.columnAtPoint(p);            if (row != -1) {                table.setRowSelectionInterval(row, row);            }            if (col != -1) {                table.setColumnSelectionInterval(col, col);            }        }        private int[] rows;        private int[] cols;    }    private static final TransferHandler defaultTransferHandler = new TableTransferHandler();    static class TableTransferHandler extends TransferHandler implements UIResource {        /**         * Create a Transferable to use as the source for a data transfer.         *         * @param c  The component holding the data to be transfered.  This         *  argument is provided to enable sharing of TransferHandlers by         *  multiple components.         * @return  The representation of the data to be transfered.         *         */        protected Transferable createTransferable(JComponent c) {            if (c instanceof JTable) {                JTable table = (JTable) c;                int[] rows;                int[] cols;                                if (!table.getRowSelectionAllowed() && !table.getColumnSelectionAllowed()) {                    return null;                }                                if (!table.getRowSelectionAllowed()) {                    int rowCount = table.getRowCount();                    rows = new int[rowCount];                    for (int counter = 0; counter < rowCount; counter++) {                        rows[counter] = counter;                    }                } else {                    rows = table.getSelectedRows();                }                                if (!table.getColumnSelectionAllowed()) {                    int colCount = table.getColumnCount();                    cols = new int[colCount];                    for (int counter = 0; counter < colCount; counter++) {                        cols[counter] = counter;                    }                } else {                    cols = table.getSelectedColumns();                }                                if (rows == null || cols == null || rows.length == 0 || cols.length == 0) {                    return null;                }                                StringBuffer plainBuf = new StringBuffer();                StringBuffer htmlBuf = new StringBuffer();                                htmlBuf.append("<html>\n<body>\n<table>\n");                                for (int row = 0; row < rows.length; row++) {                    htmlBuf.append("<tr>\n");                    for (int col = 0; col < cols.length; col++) {                        Object obj = table.getValueAt(rows[row], cols[col]);                        String val = ((obj == null) ? "" : obj.toString());                        plainBuf.append(val + "\t");                        htmlBuf.append("  <td>" + val + "</td>\n");                    }                    // we want a newline at the end of each line and not a tab                    plainBuf.deleteCharAt(plainBuf.length() - 1).append("\n");                    htmlBuf.append("</tr>\n");                }                // remove the last newline                plainBuf.deleteCharAt(plainBuf.length() - 1);                htmlBuf.append("</table>\n</body>\n</html>");                                return new SynthTransferable(plainBuf.toString(), htmlBuf.toString());            }            return null;        }        public int getSourceActions(JComponent c) {            return COPY;        }    }    /**     * PropertyChangeListener for the table. Updates the appropriate     * varaible based on what changes.     */    private class PropertyChangeHandler implements	               PropertyChangeListener {	public void propertyChange(PropertyChangeEvent event) {	    String changeName = event.getPropertyName();            if (SynthLookAndFeel.shouldUpdateStyle(event)) {                fetchStyle((JTable)event.getSource());            }	    if (changeName.equals("componentOrientation")) {		InputMap inputMap = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);		SwingUtilities.replaceUIInputMap(table,				JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT,				inputMap);		JTableHeader header = table.getTableHeader();		if (header != null) {		    header.setComponentOrientation((ComponentOrientation)event.getNewValue());		}            } else if ("transferHandler".equals(changeName)) {                DropTarget dropTarget = table.getDropTarget();                if (dropTarget instanceof UIResource) {                    if (defaultDropTargetListener == null) {                        defaultDropTargetListener = new TableDropTargetListener();                    }                    try {                        dropTarget.addDropTargetListener(defaultDropTargetListener);                    } catch (TooManyListenersException tmle) {                        // should not happen... swing drop target is multicast                    }                }            }	}    } // End of BasicTableUI.PropertyChangeHandler}  // End of Class BasicTableUI

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?