Hi,

I tweaked JTable a bit, so that it is now possible to programatically set
the column widths. I also check in some Mauve tests to back these changes.

2005-09-12  Roman Kennke  <[EMAIL PROTECTED]>

        * javax/swing/JTable.java
        (TableColumnPropertyChangeHandler): New inner class. Handles
        changes of column widths.
        (JTable(TableModel, TableColumnModel, ListSelectionModel)):
        Check if column model == null and if so, create a default model.
        (initializeLocalVars): Changed to use createDefaultColumnsFromModel
        instead of createColumnsFromModel.
        (addColumn): Add property change handler to new column.
        (createColumnsFromModel): Removed redundant private method.
        Use the public createDefaultColumnsFromModel instead.
        (tableChanged): Use createDefaultColumnsFromModel instead of
        createColumnsFromModel.
        (setModel): Use createDefaultColumnsFromModel instead of
        createColumnsFromModel.
        (doLayout): When handling AUTO_RESIZE_OFF, then adjust the
        size of the resizing column to it's (new) preferred size.
        (createDefaultColumnsFromModel): Added assertion to make sure
        that the column model is not null. Add property change handler
        to new columns.
        * javax/swing/table/TableColumn.java
        (setWidth): Fire property change with name 'width' instead
        of using the (obsolete) constant field COLUMN_WIDTH_PROPERTY.
        (setPreferredWidth): Make this property a bound property.

/Roman
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 <code>TableColumn</code>s of this
+   * <code>JTable</code>.
+   *
+   * More specifically, this triggers a [EMAIL PROTECTED] #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 <code>JTable</code> 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);
   }
 
   /**
_______________________________________________
Classpath-patches mailing list
Classpath-patches@gnu.org
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to