/* * Open Source Physics software is free software as described near the bottom of this code file. * * For additional information and documentation on Open Source Physics please see: * <http://www.opensourcephysics.org/> */ package org.opensourcephysics.display2d; import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.event.TableModelEvent; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class GridDataTable extends JTable implements ActionListener { static final Color PANEL_BACKGROUND = javax.swing.UIManager.getColor("Panel.background"); //$NON-NLS-1$ int refreshDelay = 0; // time in ms to delay refresh events javax.swing.Timer refreshTimer = new javax.swing.Timer(refreshDelay, this); // delay for refreshTable GridTableModel tableModel; RowNumberRenderer rowNumberRenderer = new RowNumberRenderer(); /** * Constructor GridDataTable * @param griddata * @param component */ public GridDataTable(GridData griddata, int component) { super(); refreshTimer.setRepeats(false); refreshTimer.setCoalesce(true); tableModel = new GridTableModel(griddata, component); setModel(tableModel); setAutoResizeMode(JTable.AUTO_RESIZE_OFF); String name = getColumnName(0); TableColumn column = getColumn(name); int width = 20; column.setMinWidth(width); column.setResizable(true); // column.setMaxWidth(width); column.setWidth(width); width = 60; for(int i = 1, n = getColumnCount(); i<n; i++) { name = getColumnName(i); column = getColumn(name); column.setMinWidth(width); column.setWidth(width); column.setResizable(true); } sizeColumnsToFit(0); } /** * Performs the action for the refresh timer by refreshing the data in the DataTable. * * @param evt */ public void actionPerformed(ActionEvent evt) { tableChanged(new TableModelEvent(tableModel, TableModelEvent.HEADER_ROW)); } /** * Refresh the data in the DataTable, as well as other changes to the table, * such as row number visibility. Changes to the TableModels displayed in the * table will not be visible until this method is called. */ public void refreshTable() { if(refreshDelay>0) { refreshTimer.start(); } else { Runnable doRefreshTable = new Runnable() { public synchronized void run() { tableChanged(new TableModelEvent(tableModel, TableModelEvent.HEADER_ROW)); } }; if(SwingUtilities.isEventDispatchThread()) { doRefreshTable.run(); } else { SwingUtilities.invokeLater(doRefreshTable); } } } /** * Returns an appropriate renderer for the cell specified by this row and * column. If the <code>TableColumn</code> for this column has a non-null * renderer, returns that. If the <code>TableColumn</code> for this column has * the same name as a name specified in the setMaximumFractionDigits method, * returns the appropriate renderer. If not, finds the class of the data in * this column (using <code>getColumnClass</code>) and returns the default * renderer for this type of data. * * @param row Description of Parameter * @param column Description of Parameter * @return The cellRenderer value */ public TableCellRenderer getCellRenderer(int row, int column) { int i = convertColumnIndexToModel(column); if(i==0) { return rowNumberRenderer; } return getDefaultRenderer(getColumnClass(column)); } private static class RowNumberRenderer extends JLabel implements TableCellRenderer { //JTable table; /** * RowNumberRenderer constructor * * @param _table Description of Parameter */ public RowNumberRenderer() { super(); //table = _table; setHorizontalAlignment(SwingConstants.RIGHT); setOpaque(true); // make background visible. setForeground(Color.BLACK); setBackground(PANEL_BACKGROUND); } /** * returns a JLabel that is highlighted if the row is selected. * * @param table * @param value * @param isSelected * @param hasFocus * @param row * @param column * @return */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(column==0) { setBackground(PANEL_BACKGROUND); } setText(value.toString()); return this; } } } /* * Open Source Physics software is free software; you can redistribute * it and/or modify it under the terms of the GNU General Public License (GPL) as * published by the Free Software Foundation; either version 2 of the License, * or(at your option) any later version. * Code that uses any portion of the code in the org.opensourcephysics package * or any subpackage (subdirectory) of this package must must also be be released * under the GNU GPL license. * * This software 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 this; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA * or view the license online at http://www.gnu.org/copyleft/gpl.html * * Copyright (c) 2007 The Open Source Physics project * http://www.opensourcephysics.org */