/*
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package javax.swing.table;
import java.io.Serializable;
import java.util.Vector;
import java.util.Enumeration;
import javax.swing.event.TableModelEvent;
This is an implementation of TableModel
that
uses a Vector
of Vectors
to store the
cell value objects.
Warning: DefaultTableModel
returns a
column class of Object
. When
DefaultTableModel
is used with a
TableRowSorter
this will result in extensive use of
toString
, which for non-String
data types
is expensive. If you use DefaultTableModel
with a
TableRowSorter
you are strongly encouraged to override
getColumnClass
to return the appropriate type.
Warning:
Serialized objects of this class will not be compatible with
future Swing releases. The current serialization support is
appropriate for short term storage or RMI between applications running
the same version of Swing. As of 1.4, support for long term storage
of all JavaBeans™
has been added to the java.beans
package. Please see XMLEncoder
.
Author: Philip Milne See Also:
/**
* This is an implementation of <code>TableModel</code> that
* uses a <code>Vector</code> of <code>Vectors</code> to store the
* cell value objects.
* <p>
* <strong>Warning:</strong> <code>DefaultTableModel</code> returns a
* column class of <code>Object</code>. When
* <code>DefaultTableModel</code> is used with a
* <code>TableRowSorter</code> this will result in extensive use of
* <code>toString</code>, which for non-<code>String</code> data types
* is expensive. If you use <code>DefaultTableModel</code> with a
* <code>TableRowSorter</code> you are strongly encouraged to override
* <code>getColumnClass</code> to return the appropriate type.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is
* appropriate for short term storage or RMI between applications running
* the same version of Swing. As of 1.4, support for long term storage
* of all JavaBeans™
* has been added to the <code>java.beans</code> package.
* Please see {@link java.beans.XMLEncoder}.
*
* @author Philip Milne
*
* @see TableModel
* @see #getDataVector
*/
@SuppressWarnings("serial") // Same-version serialization only
public class DefaultTableModel extends AbstractTableModel implements Serializable {
//
// Instance Variables
//
The Vector
of Vectors
of
Object
values.
/**
* The <code>Vector</code> of <code>Vectors</code> of
* <code>Object</code> values.
*/
@SuppressWarnings("rawtypes")
protected Vector<Vector> dataVector;
The Vector
of column identifiers. /** The <code>Vector</code> of column identifiers. */
@SuppressWarnings("rawtypes")
protected Vector columnIdentifiers;
// Unfortunately, for greater source compatibility the inner-most
// Vector in the two fields above is being left raw. The Vector is
// read as well as written so using Vector<?> is not suitable and
// using Vector<Object> (without adding copying of input Vectors),
// would disallow existing code that used, say, a Vector<String>
// as an input parameter.
//
// Constructors
//
Constructs a default DefaultTableModel
which is a table of zero columns and zero rows.
/**
* Constructs a default <code>DefaultTableModel</code>
* which is a table of zero columns and zero rows.
*/
public DefaultTableModel() {
this(0, 0);
}
private static <E> Vector<E> newVector(int size) {
Vector<E> v = new Vector<>(size);
v.setSize(size);
return v;
}
Constructs a DefaultTableModel
with
rowCount
and columnCount
of
null
object values.
Params: - rowCount – the number of rows the table holds
- columnCount – the number of columns the table holds
See Also:
/**
* Constructs a <code>DefaultTableModel</code> with
* <code>rowCount</code> and <code>columnCount</code> of
* <code>null</code> object values.
*
* @param rowCount the number of rows the table holds
* @param columnCount the number of columns the table holds
*
* @see #setValueAt
*/
public DefaultTableModel(int rowCount, int columnCount) {
this(newVector(columnCount), rowCount);
}
Constructs a DefaultTableModel
with as many columns
as there are elements in columnNames
and rowCount
of null
object values. Each column's name will be taken from
the columnNames
vector.
Params: - columnNames –
vector
containing the names
of the new columns; if this is
null
then the model has no columns - rowCount – the number of rows the table holds
See Also:
/**
* Constructs a <code>DefaultTableModel</code> with as many columns
* as there are elements in <code>columnNames</code>
* and <code>rowCount</code> of <code>null</code>
* object values. Each column's name will be taken from
* the <code>columnNames</code> vector.
*
* @param columnNames <code>vector</code> containing the names
* of the new columns; if this is
* <code>null</code> then the model has no columns
* @param rowCount the number of rows the table holds
* @see #setDataVector
* @see #setValueAt
*/
public DefaultTableModel(Vector<?> columnNames, int rowCount) {
setDataVector(newVector(rowCount), columnNames);
}
Constructs a DefaultTableModel
with as many
columns as there are elements in columnNames
and rowCount
of null
object values. Each column's name will be taken from
the columnNames
array.
Params: - columnNames –
array
containing the names
of the new columns; if this is
null
then the model has no columns - rowCount – the number of rows the table holds
See Also:
/**
* Constructs a <code>DefaultTableModel</code> with as many
* columns as there are elements in <code>columnNames</code>
* and <code>rowCount</code> of <code>null</code>
* object values. Each column's name will be taken from
* the <code>columnNames</code> array.
*
* @param columnNames <code>array</code> containing the names
* of the new columns; if this is
* <code>null</code> then the model has no columns
* @param rowCount the number of rows the table holds
* @see #setDataVector
* @see #setValueAt
*/
public DefaultTableModel(Object[] columnNames, int rowCount) {
this(convertToVector(columnNames), rowCount);
}
Constructs a DefaultTableModel
and initializes the table
by passing data
and columnNames
to the setDataVector
method.
Params: - data – the data of the table, a
Vector
of Vector
s of Object
values - columnNames –
vector
containing the names
of the new columns
See Also:
/**
* Constructs a <code>DefaultTableModel</code> and initializes the table
* by passing <code>data</code> and <code>columnNames</code>
* to the <code>setDataVector</code> method.
*
* @param data the data of the table, a <code>Vector</code>
* of <code>Vector</code>s of <code>Object</code>
* values
* @param columnNames <code>vector</code> containing the names
* of the new columns
* @see #getDataVector
* @see #setDataVector
*/
@SuppressWarnings("rawtypes")
public DefaultTableModel(Vector<? extends Vector> data, Vector<?> columnNames) {
setDataVector(data, columnNames);
}
Constructs a DefaultTableModel
and initializes the table
by passing data
and columnNames
to the setDataVector
method. The first index in the Object[][]
array is
the row index and the second is the column index.
Params: - data – the data of the table
- columnNames – the names of the columns
See Also:
/**
* Constructs a <code>DefaultTableModel</code> and initializes the table
* by passing <code>data</code> and <code>columnNames</code>
* to the <code>setDataVector</code>
* method. The first index in the <code>Object[][]</code> array is
* the row index and the second is the column index.
*
* @param data the data of the table
* @param columnNames the names of the columns
* @see #getDataVector
* @see #setDataVector
*/
public DefaultTableModel(Object[][] data, Object[] columnNames) {
setDataVector(data, columnNames);
}
Returns the Vector
of Vectors
that contains the table's
data values. The vectors contained in the outer vector are
each a single row of values. In other words, to get to the cell
at row 1, column 5:
((Vector)getDataVector().elementAt(1)).elementAt(5);
See Also: Returns: the vector of vectors containing the tables data values
/**
* Returns the <code>Vector</code> of <code>Vectors</code>
* that contains the table's
* data values. The vectors contained in the outer vector are
* each a single row of values. In other words, to get to the cell
* at row 1, column 5: <p>
*
* <code>((Vector)getDataVector().elementAt(1)).elementAt(5);</code>
*
* @return the vector of vectors containing the tables data values
*
* @see #newDataAvailable
* @see #newRowsAdded
* @see #setDataVector
*/
@SuppressWarnings("rawtypes")
public Vector<Vector> getDataVector() {
return dataVector;
}
private static <E> Vector<E> nonNullVector(Vector<E> v) {
return (v != null) ? v : new Vector<>();
}
Replaces the current dataVector
instance variable
with the new Vector
of rows, dataVector
.
Each row is represented in dataVector
as a
Vector
of Object
values.
columnIdentifiers
are the names of the new
columns. The first name in columnIdentifiers
is
mapped to column 0 in dataVector
. Each row in
dataVector
is adjusted to match the number of
columns in columnIdentifiers
either by truncating the Vector
if it is too long,
or adding null
values if it is too short.
Note that passing in a null
value for
dataVector
results in unspecified behavior,
an possibly an exception.
Params: - dataVector – the new data vector
- columnIdentifiers – the names of the columns
See Also:
/**
* Replaces the current <code>dataVector</code> instance variable
* with the new <code>Vector</code> of rows, <code>dataVector</code>.
* Each row is represented in <code>dataVector</code> as a
* <code>Vector</code> of <code>Object</code> values.
* <code>columnIdentifiers</code> are the names of the new
* columns. The first name in <code>columnIdentifiers</code> is
* mapped to column 0 in <code>dataVector</code>. Each row in
* <code>dataVector</code> is adjusted to match the number of
* columns in <code>columnIdentifiers</code>
* either by truncating the <code>Vector</code> if it is too long,
* or adding <code>null</code> values if it is too short.
* <p>Note that passing in a <code>null</code> value for
* <code>dataVector</code> results in unspecified behavior,
* an possibly an exception.
*
* @param dataVector the new data vector
* @param columnIdentifiers the names of the columns
* @see #getDataVector
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public void setDataVector(Vector<? extends Vector> dataVector,
Vector<?> columnIdentifiers) {
this.dataVector = nonNullVector((Vector<Vector>)dataVector);
this.columnIdentifiers = nonNullVector(columnIdentifiers);
justifyRows(0, getRowCount());
fireTableStructureChanged();
}
Replaces the value in the dataVector
instance
variable with the values in the array dataVector
.
The first index in the Object[][]
array is the row index and the second is the column index.
columnIdentifiers
are the names of the new columns.
Params: - dataVector – the new data vector
- columnIdentifiers – the names of the columns
See Also:
/**
* Replaces the value in the <code>dataVector</code> instance
* variable with the values in the array <code>dataVector</code>.
* The first index in the <code>Object[][]</code>
* array is the row index and the second is the column index.
* <code>columnIdentifiers</code> are the names of the new columns.
*
* @param dataVector the new data vector
* @param columnIdentifiers the names of the columns
* @see #setDataVector(Vector, Vector)
*/
public void setDataVector(Object[][] dataVector, Object[] columnIdentifiers) {
setDataVector(convertToVector(dataVector), convertToVector(columnIdentifiers));
}
Equivalent to fireTableChanged
.
Params: - event – the change event
/**
* Equivalent to <code>fireTableChanged</code>.
*
* @param event the change event
*
*/
public void newDataAvailable(TableModelEvent event) {
fireTableChanged(event);
}
//
// Manipulating rows
//
private void justifyRows(int from, int to) {
// Sometimes the DefaultTableModel is subclassed
// instead of the AbstractTableModel by mistake.
// Set the number of rows for the case when getRowCount
// is overridden.
dataVector.setSize(getRowCount());
for (int i = from; i < to; i++) {
if (dataVector.elementAt(i) == null) {
dataVector.setElementAt(new Vector<>(), i);
}
dataVector.elementAt(i).setSize(getColumnCount());
}
}
Ensures that the new rows have the correct number of columns.
This is accomplished by using the setSize
method in
Vector
which truncates vectors
which are too long, and appends null
s if they
are too short.
This method also sends out a tableChanged
notification message to all the listeners.
Params: - e – this
TableModelEvent
describes
where the rows were added.
If null
it assumes
all the rows were newly added
See Also:
/**
* Ensures that the new rows have the correct number of columns.
* This is accomplished by using the <code>setSize</code> method in
* <code>Vector</code> which truncates vectors
* which are too long, and appends <code>null</code>s if they
* are too short.
* This method also sends out a <code>tableChanged</code>
* notification message to all the listeners.
*
* @param e this <code>TableModelEvent</code> describes
* where the rows were added.
* If <code>null</code> it assumes
* all the rows were newly added
* @see #getDataVector
*/
public void newRowsAdded(TableModelEvent e) {
justifyRows(e.getFirstRow(), e.getLastRow() + 1);
fireTableChanged(e);
}
Equivalent to fireTableChanged
.
@param event the change event
/**
* Equivalent to <code>fireTableChanged</code>.
*
* @param event the change event
*
*/
public void rowsRemoved(TableModelEvent event) {
fireTableChanged(event);
}
Obsolete as of Java 2 platform v1.3. Please use setRowCount
instead.
Params: - rowCount – the new number of rows
/**
* Obsolete as of Java 2 platform v1.3. Please use <code>setRowCount</code> instead.
* @param rowCount the new number of rows
*/
public void setNumRows(int rowCount) {
int old = getRowCount();
if (old == rowCount) {
return;
}
dataVector.setSize(rowCount);
if (rowCount <= old) {
fireTableRowsDeleted(rowCount, old-1);
}
else {
justifyRows(old, rowCount);
fireTableRowsInserted(old, rowCount-1);
}
}
Sets the number of rows in the model. If the new size is greater
than the current size, new rows are added to the end of the model
If the new size is less than the current size, all
rows at index rowCount
and greater are discarded.
@see #setColumnCount
Params: - rowCount – number of rows in the model
Since: 1.3
/**
* Sets the number of rows in the model. If the new size is greater
* than the current size, new rows are added to the end of the model
* If the new size is less than the current size, all
* rows at index <code>rowCount</code> and greater are discarded.
*
* @see #setColumnCount
* @since 1.3
*
* @param rowCount number of rows in the model
*/
public void setRowCount(int rowCount) {
setNumRows(rowCount);
}
Adds a row to the end of the model. The new row will contain
null
values unless rowData
is specified.
Notification of the row being added will be generated.
Params: - rowData – optional data of the row being added
/**
* Adds a row to the end of the model. The new row will contain
* <code>null</code> values unless <code>rowData</code> is specified.
* Notification of the row being added will be generated.
*
* @param rowData optional data of the row being added
*/
public void addRow(Vector<?> rowData) {
insertRow(getRowCount(), rowData);
}
Adds a row to the end of the model. The new row will contain
null
values unless rowData
is specified.
Notification of the row being added will be generated.
Params: - rowData – optional data of the row being added
/**
* Adds a row to the end of the model. The new row will contain
* <code>null</code> values unless <code>rowData</code> is specified.
* Notification of the row being added will be generated.
*
* @param rowData optional data of the row being added
*/
public void addRow(Object[] rowData) {
addRow(convertToVector(rowData));
}
Inserts a row at row
in the model. The new row
will contain null
values unless rowData
is specified. Notification of the row being added will be generated.
Params: - row – the row index of the row to be inserted
- rowData – optional data of the row being added
Throws: - ArrayIndexOutOfBoundsException – if the row was invalid
/**
* Inserts a row at <code>row</code> in the model. The new row
* will contain <code>null</code> values unless <code>rowData</code>
* is specified. Notification of the row being added will be generated.
*
* @param row the row index of the row to be inserted
* @param rowData optional data of the row being added
* @exception ArrayIndexOutOfBoundsException if the row was invalid
*/
public void insertRow(int row, Vector<?> rowData) {
dataVector.insertElementAt(rowData, row);
justifyRows(row, row+1);
fireTableRowsInserted(row, row);
}
Inserts a row at row
in the model. The new row
will contain null
values unless rowData
is specified. Notification of the row being added will be generated.
Params: - row – the row index of the row to be inserted
- rowData – optional data of the row being added
Throws: - ArrayIndexOutOfBoundsException – if the row was invalid
/**
* Inserts a row at <code>row</code> in the model. The new row
* will contain <code>null</code> values unless <code>rowData</code>
* is specified. Notification of the row being added will be generated.
*
* @param row the row index of the row to be inserted
* @param rowData optional data of the row being added
* @exception ArrayIndexOutOfBoundsException if the row was invalid
*/
public void insertRow(int row, Object[] rowData) {
insertRow(row, convertToVector(rowData));
}
private static int gcd(int i, int j) {
return (j == 0) ? i : gcd(j, i%j);
}
private static <E> void rotate(Vector<E> v, int a, int b, int shift) {
int size = b - a;
int r = size - shift;
int g = gcd(size, r);
for(int i = 0; i < g; i++) {
int to = i;
E tmp = v.elementAt(a + to);
for(int from = (to + r) % size; from != i; from = (to + r) % size) {
v.setElementAt(v.elementAt(a + from), a + to);
to = from;
}
v.setElementAt(tmp, a + to);
}
}
Moves one or more rows from the inclusive range start
to
end
to the to
position in the model.
After the move, the row that was at index start
will be at index to
.
This method will send a tableChanged
notification
message to all the listeners.
Examples of moves:
1. moveRow(1,3,5);
a|B|C|D|e|f|g|h|i|j|k - before
a|e|f|g|h|B|C|D|i|j|k - after
2. moveRow(6,7,1);
a|b|c|d|e|f|G|H|i|j|k - before
a|G|H|b|c|d|e|f|i|j|k - after
Params: - start – the starting row index to be moved
- end – the ending row index to be moved
- to – the destination of the rows to be moved
Throws: - ArrayIndexOutOfBoundsException – if any of the elements
would be moved out of the table's range
/**
* Moves one or more rows from the inclusive range <code>start</code> to
* <code>end</code> to the <code>to</code> position in the model.
* After the move, the row that was at index <code>start</code>
* will be at index <code>to</code>.
* This method will send a <code>tableChanged</code> notification
message to all the listeners.
*
* <pre>
* Examples of moves:
*
* 1. moveRow(1,3,5);
* a|B|C|D|e|f|g|h|i|j|k - before
* a|e|f|g|h|B|C|D|i|j|k - after
*
* 2. moveRow(6,7,1);
* a|b|c|d|e|f|G|H|i|j|k - before
* a|G|H|b|c|d|e|f|i|j|k - after
* </pre>
*
* @param start the starting row index to be moved
* @param end the ending row index to be moved
* @param to the destination of the rows to be moved
* @exception ArrayIndexOutOfBoundsException if any of the elements
* would be moved out of the table's range
*
*/
public void moveRow(int start, int end, int to) {
int shift = to - start;
int first, last;
if (shift < 0) {
first = to;
last = end;
}
else {
first = start;
last = to + end - start;
}
rotate(dataVector, first, last + 1, shift);
fireTableRowsUpdated(first, last);
}
Removes the row at row
from the model. Notification
of the row being removed will be sent to all the listeners.
Params: - row – the row index of the row to be removed
Throws: - ArrayIndexOutOfBoundsException – if the row was invalid
/**
* Removes the row at <code>row</code> from the model. Notification
* of the row being removed will be sent to all the listeners.
*
* @param row the row index of the row to be removed
* @exception ArrayIndexOutOfBoundsException if the row was invalid
*/
public void removeRow(int row) {
dataVector.removeElementAt(row);
fireTableRowsDeleted(row, row);
}
//
// Manipulating columns
//
Replaces the column identifiers in the model. If the number of
newIdentifier
s is greater than the current number
of columns, new columns are added to the end of each row in the model.
If the number of newIdentifier
s is less than the current
number of columns, all the extra columns at the end of a row are
discarded.
Params: - columnIdentifiers – vector of column identifiers. If
null
, set the model
to zero columns
See Also:
/**
* Replaces the column identifiers in the model. If the number of
* <code>newIdentifier</code>s is greater than the current number
* of columns, new columns are added to the end of each row in the model.
* If the number of <code>newIdentifier</code>s is less than the current
* number of columns, all the extra columns at the end of a row are
* discarded.
*
* @param columnIdentifiers vector of column identifiers. If
* <code>null</code>, set the model
* to zero columns
* @see #setNumRows
*/
public void setColumnIdentifiers(Vector<?> columnIdentifiers) {
setDataVector(dataVector, columnIdentifiers);
}
Replaces the column identifiers in the model. If the number of
newIdentifier
s is greater than the current number
of columns, new columns are added to the end of each row in the model.
If the number of newIdentifier
s is less than the current
number of columns, all the extra columns at the end of a row are
discarded.
Params: - newIdentifiers – array of column identifiers.
If
null
, set
the model to zero columns
See Also:
/**
* Replaces the column identifiers in the model. If the number of
* <code>newIdentifier</code>s is greater than the current number
* of columns, new columns are added to the end of each row in the model.
* If the number of <code>newIdentifier</code>s is less than the current
* number of columns, all the extra columns at the end of a row are
* discarded.
*
* @param newIdentifiers array of column identifiers.
* If <code>null</code>, set
* the model to zero columns
* @see #setNumRows
*/
public void setColumnIdentifiers(Object[] newIdentifiers) {
setColumnIdentifiers(convertToVector(newIdentifiers));
}
Sets the number of columns in the model. If the new size is greater
than the current size, new columns are added to the end of the model
with null
cell values.
If the new size is less than the current size, all columns at index
columnCount
and greater are discarded.
@param columnCount the new number of columns in the model
@see #setColumnCount
Since: 1.3
/**
* Sets the number of columns in the model. If the new size is greater
* than the current size, new columns are added to the end of the model
* with <code>null</code> cell values.
* If the new size is less than the current size, all columns at index
* <code>columnCount</code> and greater are discarded.
*
* @param columnCount the new number of columns in the model
*
* @see #setColumnCount
* @since 1.3
*/
public void setColumnCount(int columnCount) {
columnIdentifiers.setSize(columnCount);
justifyRows(0, getRowCount());
fireTableStructureChanged();
}
Adds a column to the model. The new column will have the
identifier columnName
, which may be null. This method
will send a
tableChanged
notification message to all the listeners.
This method is a cover for addColumn(Object, Vector)
which
uses null
as the data vector.
Params: - columnName – the identifier of the column being added
/**
* Adds a column to the model. The new column will have the
* identifier <code>columnName</code>, which may be null. This method
* will send a
* <code>tableChanged</code> notification message to all the listeners.
* This method is a cover for <code>addColumn(Object, Vector)</code> which
* uses <code>null</code> as the data vector.
*
* @param columnName the identifier of the column being added
*/
public void addColumn(Object columnName) {
addColumn(columnName, (Vector<Object>)null);
}
Adds a column to the model. The new column will have the
identifier columnName
, which may be null.
columnData
is the
optional vector of data for the column. If it is null
the column is filled with null
values. Otherwise,
the new data will be added to model starting with the first
element going to row 0, etc. This method will send a
tableChanged
notification message to all the listeners.
Params: - columnName – the identifier of the column being added
- columnData – optional data of the column being added
/**
* Adds a column to the model. The new column will have the
* identifier <code>columnName</code>, which may be null.
* <code>columnData</code> is the
* optional vector of data for the column. If it is <code>null</code>
* the column is filled with <code>null</code> values. Otherwise,
* the new data will be added to model starting with the first
* element going to row 0, etc. This method will send a
* <code>tableChanged</code> notification message to all the listeners.
*
* @param columnName the identifier of the column being added
* @param columnData optional data of the column being added
*/
@SuppressWarnings("unchecked") // Adding element to raw columnIdentifiers
public void addColumn(Object columnName, Vector<?> columnData) {
columnIdentifiers.addElement(columnName);
if (columnData != null) {
int columnSize = columnData.size();
if (columnSize > getRowCount()) {
dataVector.setSize(columnSize);
}
justifyRows(0, getRowCount());
int newColumn = getColumnCount() - 1;
for(int i = 0; i < columnSize; i++) {
Vector<Object> row = dataVector.elementAt(i);
row.setElementAt(columnData.elementAt(i), newColumn);
}
}
else {
justifyRows(0, getRowCount());
}
fireTableStructureChanged();
}
Adds a column to the model. The new column will have the
identifier columnName
. columnData
is the
optional array of data for the column. If it is null
the column is filled with null
values. Otherwise,
the new data will be added to model starting with the first
element going to row 0, etc. This method will send a
tableChanged
notification message to all the listeners.
Params: - columnName – identifier of the newly created column
- columnData – new data to be added to the column
See Also:
/**
* Adds a column to the model. The new column will have the
* identifier <code>columnName</code>. <code>columnData</code> is the
* optional array of data for the column. If it is <code>null</code>
* the column is filled with <code>null</code> values. Otherwise,
* the new data will be added to model starting with the first
* element going to row 0, etc. This method will send a
* <code>tableChanged</code> notification message to all the listeners.
*
* @param columnName identifier of the newly created column
* @param columnData new data to be added to the column
*
* @see #addColumn(Object, Vector)
*/
public void addColumn(Object columnName, Object[] columnData) {
addColumn(columnName, convertToVector(columnData));
}
//
// Implementing the TableModel interface
//
Returns the number of rows in this data table.
Returns: the number of rows in the model
/**
* Returns the number of rows in this data table.
* @return the number of rows in the model
*/
public int getRowCount() {
return dataVector.size();
}
Returns the number of columns in this data table.
Returns: the number of columns in the model
/**
* Returns the number of columns in this data table.
* @return the number of columns in the model
*/
public int getColumnCount() {
return columnIdentifiers.size();
}
Returns the column name.
Returns: a name for this column using the string value of the
appropriate member in columnIdentifiers
.
If columnIdentifiers
does not have an entry
for this index, returns the default
name provided by the superclass.
/**
* Returns the column name.
*
* @return a name for this column using the string value of the
* appropriate member in <code>columnIdentifiers</code>.
* If <code>columnIdentifiers</code> does not have an entry
* for this index, returns the default
* name provided by the superclass.
*/
public String getColumnName(int column) {
Object id = null;
// This test is to cover the case when
// getColumnCount has been subclassed by mistake ...
if (column < columnIdentifiers.size() && (column >= 0)) {
id = columnIdentifiers.elementAt(column);
}
return (id == null) ? super.getColumnName(column)
: id.toString();
}
Returns true regardless of parameter values.
Params: - row – the row whose value is to be queried
- column – the column whose value is to be queried
See Also: Returns: true
/**
* Returns true regardless of parameter values.
*
* @param row the row whose value is to be queried
* @param column the column whose value is to be queried
* @return true
* @see #setValueAt
*/
public boolean isCellEditable(int row, int column) {
return true;
}
Returns an attribute value for the cell at row
and column
.
Params: - row – the row whose value is to be queried
- column – the column whose value is to be queried
Throws: - ArrayIndexOutOfBoundsException – if an invalid row or
column was given
Returns: the value Object at the specified cell
/**
* Returns an attribute value for the cell at <code>row</code>
* and <code>column</code>.
*
* @param row the row whose value is to be queried
* @param column the column whose value is to be queried
* @return the value Object at the specified cell
* @exception ArrayIndexOutOfBoundsException if an invalid row or
* column was given
*/
public Object getValueAt(int row, int column) {
@SuppressWarnings("unchecked")
Vector<Object> rowVector = dataVector.elementAt(row);
return rowVector.elementAt(column);
}
Sets the object value for the cell at column
and
row
. aValue
is the new value. This method
will generate a tableChanged
notification.
Params: - aValue – the new value; this can be null
- row – the row whose value is to be changed
- column – the column whose value is to be changed
Throws: - ArrayIndexOutOfBoundsException – if an invalid row or
column was given
/**
* Sets the object value for the cell at <code>column</code> and
* <code>row</code>. <code>aValue</code> is the new value. This method
* will generate a <code>tableChanged</code> notification.
*
* @param aValue the new value; this can be null
* @param row the row whose value is to be changed
* @param column the column whose value is to be changed
* @exception ArrayIndexOutOfBoundsException if an invalid row or
* column was given
*/
public void setValueAt(Object aValue, int row, int column) {
@SuppressWarnings("unchecked")
Vector<Object> rowVector = dataVector.elementAt(row);
rowVector.setElementAt(aValue, column);
fireTableCellUpdated(row, column);
}
//
// Protected Methods
//
Returns a vector that contains the same objects as the array.
Params: - anArray – the array to be converted
Returns: the new vector; if anArray
is null
,
returns null
/**
* Returns a vector that contains the same objects as the array.
* @param anArray the array to be converted
* @return the new vector; if <code>anArray</code> is <code>null</code>,
* returns <code>null</code>
*/
protected static Vector<Object> convertToVector(Object[] anArray) {
if (anArray == null) {
return null;
}
Vector<Object> v = new Vector<>(anArray.length);
for (Object o : anArray) {
v.addElement(o);
}
return v;
}
Returns a vector of vectors that contains the same objects as the array.
Params: - anArray – the double array to be converted
Returns: the new vector of vectors; if anArray
is
null
, returns null
/**
* Returns a vector of vectors that contains the same objects as the array.
* @param anArray the double array to be converted
* @return the new vector of vectors; if <code>anArray</code> is
* <code>null</code>, returns <code>null</code>
*/
protected static Vector<Vector<Object>> convertToVector(Object[][] anArray) {
if (anArray == null) {
return null;
}
Vector<Vector<Object>> v = new Vector<>(anArray.length);
for (Object[] o : anArray) {
v.addElement(convertToVector(o));
}
return v;
}
} // End of class DefaultTableModel