Index: javax/swing/JTable.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/JTable.java,v
retrieving revision 1.44
diff -u -r1.44 JTable.java
--- javax/swing/JTable.java 31 Aug 2005 18:54:47 -0000 1.44
+++ javax/swing/JTable.java 12 Sep 2005 12:31:01 -0000
@@ -47,6 +47,8 @@
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.Date;
@@ -80,6 +82,33 @@
implements TableModelListener, Scrollable, TableColumnModelListener,
ListSelectionListener, CellEditorListener, Accessible
{
+ /**
+ * Handles property changes from the TableColumn
s of this
+ * JTable
.
+ *
+ * More specifically, this triggers a address@hidden #revalidate} call if the
+ * preferredWidth of one of the observed columns changes.
+ */
+ class TableColumnPropertyChangeHandler implements PropertyChangeListener
+ {
+ /**
+ * Receives notification that a property of the observed TableColumns
+ * has changed.
+ *
+ * @param ev the property change event
+ */
+ public void propertyChange(PropertyChangeEvent ev)
+ {
+ if (ev.getPropertyName().equals("preferredWidth"))
+ {
+ JTableHeader header = getTableHeader();
+ TableColumn col = (TableColumn) ev.getSource();
+ header.setResizingColumn(col);
+ doLayout();
+ header.setResizingColumn(null);
+ }
+ }
+ }
/**
* A cell renderer for boolean values.
@@ -584,6 +613,12 @@
Object oldCellValue;
/**
+ * The property handler for this table's columns.
+ */
+ TableColumnPropertyChangeHandler tableColumnPropertyChangeHandler =
+ new TableColumnPropertyChangeHandler();
+
+ /**
* Creates a new JTable
instance.
*/
public JTable ()
@@ -645,8 +680,17 @@
{
setModel(dm == null ? createDefaultDataModel() : dm);
setSelectionModel(sm == null ? createDefaultSelectionModel() : sm);
-
- this.columnModel = cm;
+
+ if (cm != null)
+ {
+ setColumnModel(cm);
+ setAutoCreateColumnsFromModel(false);
+ }
+ else
+ {
+ setColumnModel(createDefaultColumnModel());
+ setAutoCreateColumnsFromModel(true);
+ }
initializeLocalVars();
// The next two lines are for compliance with the JDK which starts
// the JLists associated with a JTable with both lead selection
@@ -659,12 +703,8 @@
protected void initializeLocalVars()
{
setTableHeader(createDefaultTableHeader());
- this.autoCreateColumnsFromModel = false;
- if (columnModel == null)
- {
- this.autoCreateColumnsFromModel = true;
- createColumnsFromModel();
- }
+ if (autoCreateColumnsFromModel)
+ createDefaultColumnsFromModel();
this.columnModel.addColumnModelListener(this);
this.defaultRenderersByColumnClass = new Hashtable();
@@ -754,6 +794,7 @@
}
columnModel.addColumn(column);
+ column.addPropertyChangeListener(tableColumnPropertyChangeHandler);
}
protected void createDefaultEditors()
@@ -799,20 +840,6 @@
return new JTableHeader(columnModel);
}
- private void createColumnsFromModel()
- {
- if (dataModel == null)
- return;
-
- TableColumnModel cm = createDefaultColumnModel();
-
- for (int i = 0; i < dataModel.getColumnCount(); ++i)
- {
- cm.addColumn(new TableColumn(i));
- }
- this.setColumnModel(cm);
- }
-
// listener support
public void columnAdded (TableColumnModelEvent event)
@@ -890,7 +917,7 @@
if ((event.getFirstRow() ==TableModelEvent.HEADER_ROW)
&& autoCreateColumnsFromModel)
- createColumnsFromModel();
+ createDefaultColumnsFromModel();
repaint();
}
@@ -1663,15 +1690,15 @@
if (m != null)
{
- // Set property.
+ // Set property.
dataModel = m;
- // Add table as TableModelListener to new model.
- dataModel.addTableModelListener(this);
+ // Add table as TableModelListener to new model.
+ dataModel.addTableModelListener(this);
- // Automatically create columns.
- if (autoCreateColumnsFromModel)
- createColumnsFromModel();
+ // Automatically create columns.
+ if (autoCreateColumnsFromModel)
+ createDefaultColumnsFromModel();
}
// Repaint table.
@@ -2023,6 +2050,8 @@
case AUTO_RESIZE_OFF:
default:
+ int prefWidth = resizingColumn.getPreferredWidth();
+ resizingColumn.setWidth(prefWidth);
}
}
else
@@ -2258,6 +2287,8 @@
*/
public void createDefaultColumnsFromModel()
{
+ assert columnModel != null : "The columnModel must not be null.";
+
// remove existing columns
int columnIndex = columnModel.getColumnCount() - 1;
while (columnIndex >= 0)
@@ -2273,6 +2304,7 @@
TableColumn column = new TableColumn(c);
column.setIdentifier(dataModel.getColumnName(c));
columnModel.addColumn(column);
+ column.addPropertyChangeListener(tableColumnPropertyChangeHandler);
}
}
Index: javax/swing/table/TableColumn.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/table/TableColumn.java,v
retrieving revision 1.14
diff -u -r1.14 TableColumn.java
--- javax/swing/table/TableColumn.java 13 Jul 2005 09:16:15 -0000 1.14
+++ javax/swing/table/TableColumn.java 12 Sep 2005 12:31:01 -0000
@@ -402,7 +402,11 @@
if (width == oldWidth)
return;
- firePropertyChange(COLUMN_WIDTH_PROPERTY, oldWidth, width);
+ // We do have a constant field COLUMN_WIDTH_PROPERTY,
+ // however, tests show that the actual fired property name is 'width'
+ // and even Sun's API docs say that this constant field is obsolete and
+ // not used.
+ firePropertyChange("width", oldWidth, width);
}
/**
@@ -422,12 +426,16 @@
*/
public void setPreferredWidth(int preferredWidth)
{
+ int oldPrefWidth = this.preferredWidth;
+
if (preferredWidth < minWidth)
this.preferredWidth = minWidth;
else if (preferredWidth > maxWidth)
this.preferredWidth = maxWidth;
else
this.preferredWidth = preferredWidth;
+
+ firePropertyChange("preferredWidth", oldPrefWidth, this.preferredWidth);
}
/**