| 1 7 8 package javax.swing; 9 10 import java.util.*; 11 12 import java.applet.Applet ; 13 import java.awt.*; 14 import java.awt.event.*; 15 import java.awt.print.*; 16 17 import java.beans.*; 18 19 import java.io.Serializable ; 20 import java.io.ObjectOutputStream ; 21 import java.io.ObjectInputStream ; 22 import java.io.IOException ; 23 24 import javax.accessibility.*; 25 26 import javax.swing.event.*; 27 import javax.swing.plaf.*; 28 import javax.swing.table.*; 29 import javax.swing.border.*; 30 31 import java.text.NumberFormat ; 32 import java.text.DateFormat ; 33 import java.text.MessageFormat ; 34 35 import javax.print.attribute.*; 36 37 134 137 public class JTable extends JComponent implements TableModelListener, Scrollable , 138 TableColumnModelListener, ListSelectionListener, CellEditorListener, 139 Accessible 140 { 141 145 149 private static final String uiClassID = "TableUI"; 150 151 152 public static final int AUTO_RESIZE_OFF = 0; 153 154 155 public static final int AUTO_RESIZE_NEXT_COLUMN = 1; 156 157 159 public static final int AUTO_RESIZE_SUBSEQUENT_COLUMNS = 2; 160 161 162 public static final int AUTO_RESIZE_LAST_COLUMN = 3; 163 164 165 public static final int AUTO_RESIZE_ALL_COLUMNS = 4; 166 167 168 176 public enum PrintMode { 177 178 182 NORMAL, 183 184 189 FIT_WIDTH 190 } 191 192 193 197 198 protected TableModel dataModel; 199 200 201 protected TableColumnModel columnModel; 202 203 204 protected ListSelectionModel selectionModel; 205 206 207 protected JTableHeader tableHeader; 208 209 210 protected int rowHeight; 211 212 213 protected int rowMargin; 214 215 216 protected Color gridColor; 217 218 219 protected boolean showHorizontalLines; 220 221 222 protected boolean showVerticalLines; 223 224 229 protected int autoResizeMode; 230 231 235 protected boolean autoCreateColumnsFromModel; 236 237 238 protected Dimension preferredViewportSize; 239 240 241 protected boolean rowSelectionAllowed; 242 243 250 255 protected boolean cellSelectionEnabled; 256 257 258 transient protected Component editorComp; 259 260 265 transient protected TableCellEditor cellEditor; 266 267 268 transient protected int editingColumn; 269 270 271 transient protected int editingRow; 272 273 278 transient protected Hashtable defaultRenderersByColumnClass; 279 280 285 transient protected Hashtable defaultEditorsByColumnClass; 286 287 288 protected Color selectionForeground; 289 290 291 protected Color selectionBackground; 292 293 297 private SizeSequence rowModel; 298 private boolean dragEnabled; 299 private boolean surrendersFocusOnKeystroke; 300 private PropertyChangeListener editorRemover = null; 301 306 private boolean columnSelectionAdjusting; 307 311 private boolean rowSelectionAdjusting; 312 313 318 private boolean isPrinting = false; 319 320 323 private Throwable printError; 324 325 328 private boolean isRowHeightSet; 329 330 334 343 public JTable() { 344 this(null, null, null); 345 } 346 347 356 public JTable(TableModel dm) { 357 this(dm, null, null); 358 } 359 360 369 public JTable(TableModel dm, TableColumnModel cm) { 370 this(dm, cm, null); 371 } 372 373 391 public JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) { 392 super(); 393 setLayout(null); 394 395 setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, 396 JComponent.getManagingFocusForwardTraversalKeys()); 397 setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, 398 JComponent.getManagingFocusBackwardTraversalKeys()); 399 400 if (cm == null) { 401 cm = createDefaultColumnModel(); 402 autoCreateColumnsFromModel = true; 403 } 404 setColumnModel(cm); 405 406 if (sm == null) { 407 sm = createDefaultSelectionModel(); 408 } 409 setSelectionModel(sm); 410 411 if (dm == null) { 415 dm = createDefaultDataModel(); 416 } 417 setModel(dm); 418 419 initializeLocalVars(); 420 updateUI(); 421 } 422 423 433 public JTable(int numRows, int numColumns) { 434 this(new DefaultTableModel(numRows, numColumns)); 435 } 436 437 451 public JTable(Vector rowData, Vector columnNames) { 452 this(new DefaultTableModel(rowData, columnNames)); 453 } 454 455 468 public JTable(final Object [][] rowData, final Object [] columnNames) { 469 this(new AbstractTableModel() { 470 public String getColumnName(int column) { return columnNames[column].toString(); } 471 public int getRowCount() { return rowData.length; } 472 public int getColumnCount() { return columnNames.length; } 473 public Object getValueAt(int row, int col) { return rowData[row][col]; } 474 public boolean isCellEditable(int row, int column) { return true; } 475 public void setValueAt(Object value, int row, int col) { 476 rowData[row][col] = value; 477 fireTableCellUpdated(row, col); 478 } 479 }); 480 } 481 482 487 public void addNotify() { 488 super.addNotify(); 489 configureEnclosingScrollPane(); 490 } 491 492 505 protected void configureEnclosingScrollPane() { 506 Container p = getParent(); 507 if (p instanceof JViewport ) { 508 Container gp = p.getParent(); 509 if (gp instanceof JScrollPane ) { 510 JScrollPane scrollPane = (JScrollPane )gp; 511 JViewport viewport = scrollPane.getViewport(); 515 if (viewport == null || viewport.getView() != this) { 516 return; 517 } 518 scrollPane.setColumnHeaderView(getTableHeader()); 519 Border border = scrollPane.getBorder(); 521 if (border == null || border instanceof UIResource) { 522 scrollPane.setBorder(UIManager.getBorder("Table.scrollPaneBorder")); 523 } 524 } 525 } 526 } 527 528 533 public void removeNotify() { 534 KeyboardFocusManager.getCurrentKeyboardFocusManager(). 535 removePropertyChangeListener("permanentFocusOwner", editorRemover); 536 editorRemover = null; 537 unconfigureEnclosingScrollPane(); 538 super.removeNotify(); 539 } 540 541 552 protected void unconfigureEnclosingScrollPane() { 553 Container p = getParent(); 554 if (p instanceof JViewport ) { 555 Container gp = p.getParent(); 556 if (gp instanceof JScrollPane ) { 557 JScrollPane scrollPane = (JScrollPane )gp; 558 JViewport viewport = scrollPane.getViewport(); 562 if (viewport == null || viewport.getView() != this) { 563 return; 564 } 565 scrollPane.setColumnHeaderView(null); 566 } 567 } 568 } 569 570 void setUIProperty(String propertyName, Object value) { 571 if (propertyName == "rowHeight") { 572 if (!isRowHeightSet) { 573 setRowHeight(((Number )value).intValue()); 574 isRowHeightSet = false; 575 } 576 return; 577 } 578 super.setUIProperty(propertyName, value); 579 } 580 581 585 591 @Deprecated  592 static public JScrollPane createScrollPaneForTable(JTable aTable) { 593 return new JScrollPane (aTable); 594 } 595 596 600 610 public void setTableHeader(JTableHeader tableHeader) { 611 if (this.tableHeader != tableHeader) { 612 JTableHeader old = this.tableHeader; 613 if (old != null) { 615 old.setTable(null); 616 } 617 this.tableHeader = tableHeader; 618 if (tableHeader != null) { 619 tableHeader.setTable(this); 620 } 621 firePropertyChange("tableHeader", old, tableHeader); 622 } 623 } 624 625 631 public JTableHeader getTableHeader() { 632 return tableHeader; 633 } 634 635 649 public void setRowHeight(int rowHeight) { 650 if (rowHeight <= 0) { 651 throw new IllegalArgumentException ("New row height less than 1"); 652 } 653 int old = this.rowHeight; 654 this.rowHeight = rowHeight; 655 rowModel = null; 656 isRowHeightSet = true; 657 resizeAndRepaint(); 658 firePropertyChange("rowHeight", old, rowHeight); 659 } 660 661 668 public int getRowHeight() { 669 return rowHeight; 670 } 671 672 private SizeSequence getRowModel() { 673 if (rowModel == null) { 674 rowModel = new SizeSequence (getRowCount(), getRowHeight()); 675 } 676 return rowModel; 677 } 678 679 693 public void setRowHeight(int row, int rowHeight) { 694 if (rowHeight <= 0) { 695 throw new IllegalArgumentException ("New row height less than 1"); 696 } 697 getRowModel().setSize(row, rowHeight); 698 resizeAndRepaint(); 699 } 700 701 706 public int getRowHeight(int row) { 707 return (rowModel == null) ? getRowHeight() : rowModel.getSize(row); 708 } 709 710 719 public void setRowMargin(int rowMargin) { 720 int old = this.rowMargin; 721 this.rowMargin = rowMargin; 722 resizeAndRepaint(); 723 firePropertyChange("rowMargin", old, rowMargin); 724 } 725 726 733 public int getRowMargin() { 734 return rowMargin; 735 } 736 737 750 public void setIntercellSpacing(Dimension intercellSpacing) { 751 setRowMargin(intercellSpacing.height); 753 getColumnModel().setColumnMargin(intercellSpacing.width); 754 755 resizeAndRepaint(); 756 } 757 758 765 public Dimension getIntercellSpacing() { 766 return new Dimension(getColumnModel().getColumnMargin(), rowMargin); 767 } 768 769 780 public void setGridColor(Color gridColor) { 781 if (gridColor == null) { 782 throw new IllegalArgumentException ("New color is null"); 783 } 784 Color old = this.gridColor; 785 this.gridColor = gridColor; 786 firePropertyChange("gridColor", old, gridColor); 787 repaint(); 789 } 790 791 798 public Color getGridColor() { 799 return gridColor; 800 } 801 802 816 public void setShowGrid(boolean showGrid) { 817 setShowHorizontalLines(showGrid); 818 setShowVerticalLines(showGrid); 819 820 repaint(); 822 } 823 824 836 public void setShowHorizontalLines(boolean showHorizontalLines) { 837 boolean old = this.showHorizontalLines; 838 this.showHorizontalLines = showHorizontalLines; 839 firePropertyChange("showHorizontalLines", old, showHorizontalLines); 840 841 repaint(); 843 } 844 845 857 public void setShowVerticalLines(boolean showVerticalLines) { 858 boolean old = this.showVerticalLines; 859 this.showVerticalLines = showVerticalLines; 860 firePropertyChange("showVerticalLines", old, showVerticalLines); 861 repaint(); 863 } 864 865 873 public boolean getShowHorizontalLines() { 874 return showHorizontalLines; 875 } 876 877 885 public boolean getShowVerticalLines() { 886 return showVerticalLines; 887 } 888 889 910 public void setAutoResizeMode(int mode) { 911 if ((mode == AUTO_RESIZE_OFF) || 912 (mode == AUTO_RESIZE_NEXT_COLUMN) || 913 (mode == AUTO_RESIZE_SUBSEQUENT_COLUMNS) || 914 (mode == AUTO_RESIZE_LAST_COLUMN) || 915 (mode == AUTO_RESIZE_ALL_COLUMNS)) { 916 int old = autoResizeMode; 917 autoResizeMode = mode; 918 resizeAndRepaint(); 919 if (tableHeader != null) { 920 tableHeader.resizeAndRepaint(); 921 } 922 firePropertyChange("autoResizeMode", old, autoResizeMode); 923 } 924 } 925 926 935 public int getAutoResizeMode() { 936 return autoResizeMode; 937 } 938 939 951 public void setAutoCreateColumnsFromModel(boolean autoCreateColumnsFromModel) { 952 if (this.autoCreateColumnsFromModel != autoCreateColumnsFromModel) { 953 boolean old = this.autoCreateColumnsFromModel; 954 this.autoCreateColumnsFromModel = autoCreateColumnsFromModel; 955 if (autoCreateColumnsFromModel) { 956 createDefaultColumnsFromModel(); 957 } 958 firePropertyChange("autoCreateColumnsFromModel", old, autoCreateColumnsFromModel); 959 } 960 } 961 962 974 public boolean getAutoCreateColumnsFromModel() { 975 return autoCreateColumnsFromModel; 976 } 977 978 988 public void createDefaultColumnsFromModel() { 989 TableModel m = getModel(); 990 if (m != null) { 991 TableColumnModel cm = getColumnModel(); 993 while (cm.getColumnCount() > 0) { 994 cm.removeColumn(cm.getColumn(0)); 995 } 996 997 for (int i = 0; i < m.getColumnCount(); i++) { 999 TableColumn newColumn = new TableColumn(i); 1000 addColumn(newColumn); 1001 } 1002 } 1003 } 1004 1005 |