Mercurial > hg > release > thermostat-0.6
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();