changeset 694:c8085fb78199

Autoresize tables review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-October/003710.html reviewed-by: rkennke
author Mario Torre <neugens.limasoftware@gmail.com>
date Mon, 15 Oct 2012 11:30:03 +0200
parents ccae584de611
children 687dc5d9beb2
files client/heapdumper/src/main/java/com/redhat/thermostat/client/heap/swing/HistogramPanel.java client/swing-components/src/main/java/com/redhat/thermostat/swing/ThermostatTable.java client/swing-components/src/main/java/com/redhat/thermostat/swing/ThermostatTableColumnResizer.java thread/client-swing/src/main/java/com/redhat/thermostat/thread/client/swing/impl/SwingThreadTableView.java
diffstat 4 files changed, 113 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/client/heapdumper/src/main/java/com/redhat/thermostat/client/heap/swing/HistogramPanel.java	Wed Oct 10 15:50:17 2012 -0400
+++ b/client/heapdumper/src/main/java/com/redhat/thermostat/client/heap/swing/HistogramPanel.java	Mon Oct 15 11:30:03 2012 +0200
@@ -44,9 +44,6 @@
 import javax.swing.BoxLayout;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.DefaultTableModel;
 
 import com.redhat.thermostat.client.heap.HeapHistogramView;
--- a/client/swing-components/src/main/java/com/redhat/thermostat/swing/ThermostatTable.java	Wed Oct 10 15:50:17 2012 -0400
+++ b/client/swing-components/src/main/java/com/redhat/thermostat/swing/ThermostatTable.java	Mon Oct 15 11:30:03 2012 +0200
@@ -44,14 +44,26 @@
 
 @SuppressWarnings("serial")
 public class ThermostatTable extends JTable {
-
+    
+    private ThermostatTableColumnResizer resizer;
+    
     public ThermostatTable() {
         this((DefaultTableModel) null);
     }
     
+    public ThermostatTable(int rowHeight) {
+        this((DefaultTableModel) null, rowHeight);
+    }
+    
     public ThermostatTable(DefaultTableModel model) {
+        this((DefaultTableModel) model, 25);
+    }
+    
+    public ThermostatTable(DefaultTableModel model, int rowHeight) {
         super(model);
 
+        setRowHeight(rowHeight);
+        
         setIntercellSpacing(new Dimension(0, 0));
         
         setFillsViewportHeight(true);
@@ -62,10 +74,18 @@
         setDefaultRenderer(Long.class, new ThermostatTableRenderer());
         setDefaultRenderer(String.class, new ThermostatTableRenderer());
         setDefaultRenderer(Integer.class, new ThermostatTableRenderer());
+        
+        this.resizer = new ThermostatTableColumnResizer(this);
+    }
+    
+    public void repackCells() {
+        resizer.resize();
+        revalidate();
     }
     
     public JScrollPane wrap() {        
         JScrollPane scrollPane = new JScrollPane(this);
+        repackCells();
         return scrollPane;
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/swing-components/src/main/java/com/redhat/thermostat/swing/ThermostatTableColumnResizer.java	Mon Oct 15 11:30:03 2012 +0200
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.swing;
+
+import java.awt.Component;
+
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
+
+class ThermostatTableColumnResizer {
+    
+    // reference Swing Hacks book:
+    // http://shop.oreilly.com/product/9780596009076.do
+    
+    private ThermostatTable table;
+    
+    public ThermostatTableColumnResizer(ThermostatTable table) {
+        this.table = table;
+    }
+    
+    public void resize() {
+        TableColumnModel model = table.getColumnModel();
+        for (int column = 0; column < table.getColumnCount(); column++ ) {
+            int maxWidth = 0;
+            for (int row = 0; row < table.getRowCount(); row++ ) {
+                TableCellRenderer renderer = table.getCellRenderer(row, column);
+                Object value = table.getValueAt(row, column);
+                Component component = renderer.getTableCellRendererComponent(table, value, false, false, row, column);
+                maxWidth = Math.max(component.getPreferredSize().width, maxWidth);
+            }
+            
+            TableColumn tableColumn = model.getColumn(column);
+            TableCellRenderer headerRenderer = tableColumn.getHeaderRenderer();
+            if (headerRenderer == null) {
+                headerRenderer = table.getTableHeader().getDefaultRenderer(); 
+            }
+            
+            Object headerValue = tableColumn.getHeaderValue();
+            Component headerComponent = headerRenderer.getTableCellRendererComponent(table, headerValue, false, false, 0, column);
+            maxWidth = Math.max(maxWidth, headerComponent.getPreferredSize().width);
+            
+            tableColumn.setPreferredWidth(maxWidth);
+        }
+    }
+}
--- a/thread/client-swing/src/main/java/com/redhat/thermostat/thread/client/swing/impl/SwingThreadTableView.java	Wed Oct 10 15:50:17 2012 -0400
+++ b/thread/client-swing/src/main/java/com/redhat/thermostat/thread/client/swing/impl/SwingThreadTableView.java	Mon Oct 15 11:30:03 2012 +0200
@@ -43,7 +43,6 @@
 import java.util.Date;
 import java.util.List;
 
-import javax.swing.JTable;
 import javax.swing.SwingUtilities;
 import javax.swing.SwingWorker;
 import javax.swing.event.TableModelEvent;
@@ -60,6 +59,8 @@
 
 public class SwingThreadTableView extends ThreadTableView implements SwingComponent {
 
+    private boolean tableRepacked = false; 
+    
     private int currentSelection = -1;
     
     private ThermostatTable table;
@@ -161,6 +162,13 @@
                         index++;
                     }
                 }
+                
+                // just repack once, or the user will see the table moving around
+                if (!tableRepacked) {
+                    table.repackCells();
+                    tableRepacked = true;
+                }
+                
                 model.fireTableDataChanged();
             }
         });
@@ -213,7 +221,7 @@
         @Override
         public Class<?> getColumnClass(int column) {
             switch (column) {
-            case 0:
+            case 1:
             case 2:
             case 3:                
                 return String.class;                
@@ -233,10 +241,10 @@
             ThreadTableBean info = infos.get(row);
             switch (column) {
             case 0:
-                result = info.getName();
+                result = info.getId();
                 break;
             case 1:
-                result = info.getId();
+                result = info.getName();
                 break;
             case 2:
                 result = new Date(info.getStartTimeStamp()).toString();