Java Tutorial/Swing/JTable Column
Содержание
- 1 Add a column without affecting existing columns
- 2 Add a column with values.
- 3 Appending a Column to a JTable Component using DefaultTableModel
- 4 Change a cell in the 2nd visible column
- 5 Change a cell in the 3rd column in the model
- 6 Change Column Widths
- 7 Changing the Name of a Column in a JTable Component
- 8 Converts a column index in the model to a visible column index
- 9 Converts a visible column index to a column index in the model.
- 10 Disable autoCreateColumnsFromModel
- 11 Disable auto resizing, Set the first visible column to 100 pixels wide
- 12 Displaying an Icon in a Column Head of a JTable Component
- 13 Get column count
- 14 Get the columns from TableColumnModel in the order that they appear in the view
- 15 Insert a new column to a table
- 16 Locking the Width of a Column in a JTable Component
- 17 Move the last visible column so it becomes the first visible column
- 18 Packing a Column of a JTable Component according to the header text
- 19 Packing a Column of a JTable Component according to the row data
- 20 Remove the first visible column without removing the underlying data
- 21 Resizable JTable Column
- 22 Returns the TableColumn associated with the specified column index in the model
- 23 Returns the visible columns in the order that they appear in the model
- 24 Set column width based on cell renderer
- 25 Set table column auto-resize off
- 26 Setting the Column Resize Mode of a JTable Component: Disable auto resizing
- 27 Setting the Width of a Column in a JTable Component
- 28 Shades every other column yellow
- 29 Shading Rows and Columns in a JTable Component
- 30 Specifying Fixed JTable Columns
- 31 the last column is moved to the first position
Add a column without affecting existing columns
<source lang="java">
import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); model = (DefaultTableModel) table.getModel(); TableColumn col = new TableColumn(model.getColumnCount()); // Ensure that auto-create is off if (table.getAutoCreateColumnsFromModel()) { throw new IllegalStateException(); } col.setHeaderValue("Col3"); table.addColumn(col); model.addColumn("Col3", new Object[] { "v3" }); }
}</source>
Add a column with values.
<source lang="java">
import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); // Add a column with values. model.addColumn("Col2", new Object[] { "v2" }); }
}</source>
Appending a Column to a JTable Component using DefaultTableModel
<source lang="java">
import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); model.addColumn("Col1"); }
}</source>
Change a cell in the 2nd visible column
<source lang="java">
import javax.swing.JTable; public class Main {
public static void main(String[] argv) throws Exception { int rows = 3; int cols = 3; JTable table = new JTable(rows, cols); table.setValueAt("New Value", 0, 0); }
}</source>
Change a cell in the 3rd column in the model
<source lang="java">
import javax.swing.JTable; public class Main {
public static void main(String[] argv) throws Exception { int rows = 3; int cols = 3; JTable table = new JTable(rows, cols); table.getModel().setValueAt("New Value", 0, 0); }
}</source>
Change Column Widths
<source lang="java">
import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.TableColumn; public class ResizeColumnWidth {
public static void main(String args[]) { final Object rowData[][] = { { "1", "one", "I" }, { "2", "two", "II" }, { "3", "three", "III" }}; final String columnNames[] = { "#", "English", "Roman" }; final JTable table = new JTable(rowData, columnNames); JScrollPane scrollPane = new JScrollPane(table);
JFrame frame = new JFrame("Resizing Table"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(scrollPane, BorderLayout.CENTER); TableColumn column = null; for (int i = 0; i < 3; i++) { column = table.getColumnModel().getColumn(i); if (i == 2) { column.setPreferredWidth(100); //sport column is bigger } else { column.setPreferredWidth(50); } } frame.setSize(300, 150); frame.setVisible(true); }
}</source>
Changing the Name of a Column in a JTable Component
<source lang="java">
import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Main {
public static void main(String[] argv) throws Exception { DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); model.addColumn("Col1"); model.addColumn("Col2"); table.getColumnModel().getColumn(0).setHeaderValue("New Name"); table.getTableHeader().resizeAndRepaint(); }
}</source>
Converts a column index in the model to a visible column index
<source lang="java">
import javax.swing.JTable; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { } public int toView(JTable table, int mColIndex) { for (int c = 0; c < table.getColumnCount(); c++) { TableColumn col = table.getColumnModel().getColumn(c); if (col.getModelIndex() == mColIndex) { return c; } } return -1; }
}</source>
Converts a visible column index to a column index in the model.
<source lang="java">
import javax.swing.JTable; public class Main {
public static void main(String[] argv) { } public int toModel(JTable table, int vColIndex) { if (vColIndex >= table.getColumnCount()) { return -1; } return table.getColumnModel().getColumn(vColIndex).getModelIndex(); }
}</source>
Disable autoCreateColumnsFromModel
<source lang="java">
import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); // Disable autoCreateColumnsFromModel table.setAutoCreateColumnsFromModel(false); }
}</source>
Disable auto resizing, Set the first visible column to 100 pixels wide
<source lang="java">
import javax.swing.JTable; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) { int rows = 3; int cols = 3; JTable table = new JTable(rows, cols); // table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); TableColumn col = table.getColumnModel().getColumn(0); int width = 100; col.setPreferredWidth(width); }
}</source>
Displaying an Icon in a Column Head of a JTable Component
<source lang="java">
import java.awt.ruponent; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.JTableHeader; public class Main {
public static void main(String[] argv) throws Exception { DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); model.addColumn("Col1"); model.addColumn("Col2"); table.getTableHeader().getColumnModel().getColumn(1).setHeaderRenderer(new IconHeaderRenderer()); table.getColumnModel().getColumn(1).setHeaderValue(new TextAndIcon("Col2", new ImageIcon("icon.gif"))); }
} class TextAndIcon {
TextAndIcon(String text, Icon icon) { this.text = text; this.icon = icon; } String text; Icon icon;
} class IconHeaderRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (table != null) { JTableHeader header = table.getTableHeader(); if (header != null) { setForeground(header.getForeground()); setBackground(header.getBackground()); setFont(header.getFont()); } } if (value instanceof TextAndIcon) { setIcon(((TextAndIcon) value).icon); setText(((TextAndIcon) value).text); } else { setText((value == null) ? "" : value.toString()); setIcon(null); } setBorder(UIManager.getBorder("TableHeader.cellBorder")); setHorizontalAlignment(JLabel.CENTER); return this; }
}</source>
Get column count
<source lang="java">
import java.util.Enumeration; import javax.swing.JTable; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { } public TableColumn[] getColumnsInView(JTable table) { TableColumn[] result = new TableColumn[table.getColumnCount()]; // Use a for loop for (int c = 0; c < table.getColumnCount(); c++) { result[c] = table.getColumnModel().getColumn(c); } return result; }
}</source>
Get the columns from TableColumnModel in the order that they appear in the view
<source lang="java">
import java.util.Enumeration; import javax.swing.JTable; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { } public TableColumn[] getColumnsInView(JTable table) { TableColumn[] result = new TableColumn[table.getColumnCount()]; // Use an enumeration Enumeration e = table.getColumnModel().getColumns(); for (int i = 0; e.hasMoreElements(); i++) { result[i] = (TableColumn) e.nextElement(); } return result; }
}</source>
Insert a new column to a table
<source lang="java">
import java.util.ArrayList; import java.util.List; import java.util.Vector; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Main {
public static void main(String[] argv) throws Exception { DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); model.addColumn("Col1"); model.addRow(new Object[] { "r1" }); model.addRow(new Object[] { "r2" }); model.addRow(new Object[] { "r3" }); Vector data = model.getDataVector(); Vector row = (Vector) data.elementAt(1); int mColIndex = 0; List colData = new ArrayList(table.getRowCount()); for (int i = 0; i < table.getRowCount(); i++) { row = (Vector) data.elementAt(i); colData.add(row.get(mColIndex)); } // Append a new column with copied data model.addColumn("Col3", colData.toArray()); JFrame f = new JFrame(); f.setSize(300, 300); f.add(new JScrollPane(table)); f.setVisible(true); }
}</source>
Locking the Width of a Column in a JTable Component
<source lang="java">
import javax.swing.JTable; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { int rows = 3; int cols = 3; JTable table = new JTable(rows, cols); TableColumn col = table.getColumnModel().getColumn(0); col.setMinWidth(100); col.setMaxWidth(100); col.setPreferredWidth(100); }
}</source>
Move the last visible column so it becomes the first visible column
<source lang="java">
import javax.swing.JTable; public class Main {
public static void main(String[] argv) throws Exception { int rows = 10; int cols = 5; JTable table = new JTable(rows, cols); table.moveColumn(table.getColumnCount() - 1, 0); }
}</source>
Packing a Column of a JTable Component according to the header text
<source lang="java">
import java.awt.ruponent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class Main {
public Main() { JTable table = new JTable(3, 3); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); for(int i=0;i<table.getColumnCount();i++){ DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel(); TableColumn col = colModel.getColumn(i); int width = 0; TableCellRenderer renderer = col.getHeaderRenderer(); if (renderer == null) { renderer = table.getTableHeader().getDefaultRenderer(); } Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0); width = comp.getPreferredSize().width; col.setPreferredWidth(width+2); } JFrame f = new JFrame(); f.add(new JScrollPane(table)); f.setSize(300, 300); f.setVisible(true); } public static void main(String[] argv) { new Main(); }
}</source>
Packing a Column of a JTable Component according to the row data
<source lang="java">
import java.awt.ruponent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class Main {
public Main() { JTable table = new JTable(3, 3); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); for (int i = 0; i < table.getColumnCount(); i++) { DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel(); TableColumn col = colModel.getColumn(i); int width = 0; TableCellRenderer renderer = col.getHeaderRenderer(); for (int r = 0; r < table.getRowCount(); r++) { renderer = table.getCellRenderer(r, i); Component comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, i), false, false, r, i); width = Math.max(width, comp.getPreferredSize().width); } col.setPreferredWidth(width + 2); } JFrame f = new JFrame(); f.add(new JScrollPane(table)); f.setSize(300, 300); f.setVisible(true); } public static void main(String[] argv) { new Main(); }
}</source>
Remove the first visible column without removing the underlying data
<source lang="java">
import java.util.Enumeration; import java.util.Vector; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { DefaultTableModel model = new MyDefaultTableModel(); JTable table = new JTable(model); table.setModel(model); model.addColumn("Col1"); model.addColumn("Col2"); model.addColumn("Col3"); model.addRow(new Object[] { "v1" });
table.removeColumn(table.getColumnModel().getColumn(0)); }
} class MyDefaultTableModel extends DefaultTableModel {
public Vector getColumnIdentifiers() { return columnIdentifiers; }
}</source>
Resizable JTable Column
ModesDescriptionAUTO_RESIZE_ALL_COLUMNSAdjusts all column widths proportionally.AUTO_RESIZE_LAST_COLUMNAdjusts the rightmost column width only to give or take space as required by the column currently being altered.AUTO_RESIZE_NEXT_COLUMNIf you"re reducing the width of a neighboring column, the neighboring column will grow to fill the unused space. If you"re increasing the width of a column, the neighboring column will shrink.AUTO_RESIZE_OFFTurns off the user"s ability to resize columns. The columns can still be resized programmatically.AUTO_RESIZE_SUBSEQUENT_COLUMNSAdjusts the width by proportionally altering (default) columns displayed to the right of the column being changed.
<source lang="java">
import java.awt.BorderLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; public class ResizeTable {
public static void main(String args[]) { final Object rowData[][] = { { "1", "one", "I" }, { "2", "two", "II" }, { "3", "three", "III" }}; final String columnNames[] = { "#", "English", "Roman" }; final JTable table = new JTable(rowData, columnNames); JScrollPane scrollPane = new JScrollPane(table); String modes[] = { "Resize All Columns", "Resize Last Column", "Resize Next Column", "Resize Off", "Resize Subsequent Columns" }; final int modeKey[] = { JTable.AUTO_RESIZE_ALL_COLUMNS, JTable.AUTO_RESIZE_LAST_COLUMN, JTable.AUTO_RESIZE_NEXT_COLUMN, JTable.AUTO_RESIZE_OFF, JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS }; JComboBox resizeModeComboBox = new JComboBox(modes); ItemListener itemListener = new ItemListener() { public void itemStateChanged(ItemEvent e) { JComboBox source = (JComboBox) e.getSource(); int index = source.getSelectedIndex(); table.setAutoResizeMode(modeKey[index]); } }; resizeModeComboBox.addItemListener(itemListener); JFrame frame = new JFrame("Resizing Table"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(resizeModeComboBox, BorderLayout.NORTH); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}</source>
Returns the TableColumn associated with the specified column index in the model
<source lang="java">
import java.util.Enumeration; import javax.swing.JTable; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) throws Exception { } public TableColumn findTableColumn(JTable table, int columnModelIndex) { Enumeration e = table.getColumnModel().getColumns(); for (; e.hasMoreElements();) { TableColumn col = (TableColumn) e.nextElement(); if (col.getModelIndex() == columnModelIndex) { return col; } } return null; }
}</source>
Returns the visible columns in the order that they appear in the model
<source lang="java">
import java.util.ArrayList; import java.util.Collections; import java.util.ruparator; import java.util.Enumeration; import java.util.List; import javax.swing.JTable; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) { } // public TableColumn[] getColumnsInModel(JTable table) { List result = new ArrayList(); for (Enumeration e = table.getColumnModel().getColumns(); e.hasMoreElements();) { result.add((TableColumn) e.nextElement()); } Collections.sort(result, new TableColumnComparator()); return (TableColumn[]) result.toArray(new TableColumn[result.size()]); }
} class TableColumnComparator implements Comparator {
public int compare(Object a, Object b) { TableColumn c1 = (TableColumn) a; TableColumn c2 = (TableColumn) b; if (c1.getModelIndex() < c2.getModelIndex()) { return -1; } else if (c1.getModelIndex() == c2.getModelIndex()) { return 0; } else { return 1; } }
}</source>
Set column width based on cell renderer
<source lang="java">
import java.awt.ruponent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class Main {
public Main() { JTable table = new JTable(3, 3); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); for (int i = 0; i < table.getColumnCount(); i++) { DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel(); TableColumn col = colModel.getColumn(i); int width = 0; TableCellRenderer renderer = col.getHeaderRenderer(); for (int r = 0; r < table.getRowCount(); r++) { renderer = table.getCellRenderer(r, i); Component comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, i), false, false, r, i); width = Math.max(width, comp.getPreferredSize().width); } col.setPreferredWidth(width + 2); } JFrame f = new JFrame(); f.add(new JScrollPane(table)); f.setSize(300, 300); f.setVisible(true); } public static void main(String[] argv) { new Main(); }
}</source>
Set table column auto-resize off
<source lang="java">
import java.awt.ruponent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class Main {
public Main() { JTable table = new JTable(3, 3); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); for(int i=0;i<table.getColumnCount();i++){ DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel(); TableColumn col = colModel.getColumn(i); int width = 0; TableCellRenderer renderer = col.getHeaderRenderer(); if (renderer == null) { renderer = table.getTableHeader().getDefaultRenderer(); } Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0); width = comp.getPreferredSize().width; col.setPreferredWidth(width+2); } JFrame f = new JFrame(); f.add(new JScrollPane(table)); f.setSize(300, 300); f.setVisible(true); } public static void main(String[] argv) { new Main(); }
}</source>
Setting the Column Resize Mode of a JTable Component: Disable auto resizing
<source lang="java">
import javax.swing.JTable; public class Main {
public static void main(String[] argv) throws Exception { Object[][] cellData = { { "1-1", "1-2" }, { "2-1", "2-2" } }; String[] columnNames = { "col1", "col2" }; JTable table = new JTable(cellData, columnNames); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); }
}</source>
Setting the Width of a Column in a JTable Component
<source lang="java">
import javax.swing.JTable; import javax.swing.table.TableColumn; public class Main {
public static void main(String[] argv) { int rows = 3; int cols = 3; JTable table = new JTable(rows, cols); // table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); TableColumn col = table.getColumnModel().getColumn(0); int width = 100; col.setPreferredWidth(width); }
}</source>
Shades every other column yellow
<source lang="java">
import java.awt.Color; import java.awt.ruponent; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; public class Main {
public static void main(String[] argv) throws Exception { JTable table = new JTable() { public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex) { Component c = super.prepareRenderer(renderer, rowIndex, vColIndex); if (vColIndex % 2 == 0 && !isCellSelected(rowIndex, vColIndex)) { c.setBackground(Color.yellow); } else { c.setBackground(getBackground()); } return c; } }; }
}</source>
Shading Rows and Columns in a JTable Component
<source lang="java">
import java.awt.Color; import java.awt.ruponent; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; public class Main {
public static void main(String[] argv) { JTable table = new JTable() { public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex) { Component c = super.prepareRenderer(renderer, rowIndex, vColIndex); if (rowIndex % 2 == 0 && !isCellSelected(rowIndex, vColIndex)) { c.setBackground(Color.yellow); } else { c.setBackground(getBackground()); } return c; } }; }
}</source>
Specifying Fixed JTable Columns
<source lang="java">
import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JViewport; import javax.swing.ListSelectionModel; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class FixedColumnModel {
public static void main(String args[]) { final Object rowData[][] = { { "1", "one", "I" }, { "2", "two", "II" }, { "3", "three", "III" } }; final String columnNames[] = { "#", "English", "Roman" }; final TableModel fixedColumnModel = new AbstractTableModel() { public int getColumnCount() { return 1; } public String getColumnName(int column) { return columnNames[column]; } public int getRowCount() { return rowData.length; } public Object getValueAt(int row, int column) { return rowData[row][column]; } }; final TableModel mainModel = new AbstractTableModel() { public int getColumnCount() { return columnNames.length - 1; } public String getColumnName(int column) { return columnNames[column + 1]; } public int getRowCount() { return rowData.length; } public Object getValueAt(int row, int column) { return rowData[row][column + 1]; } }; JTable fixedTable = new JTable(fixedColumnModel); fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JTable mainTable = new JTable(mainModel); mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); ListSelectionModel model = fixedTable.getSelectionModel(); mainTable.setSelectionModel(model); JScrollPane scrollPane = new JScrollPane(mainTable); Dimension fixedSize = fixedTable.getPreferredSize(); JViewport viewport = new JViewport(); viewport.setView(fixedTable); viewport.setPreferredSize(fixedSize); viewport.setMaximumSize(fixedSize); scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable.getTableHeader()); scrollPane.setRowHeaderView(viewport); JFrame frame = new JFrame("Fixed Column Table"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}</source>
the last column is moved to the first position
<source lang="java">
import javax.swing.JTable; public class Main {
public static void main(String[] argv) throws Exception { int rows = 3; int cols = 3; JTable table = new JTable(rows, cols); table.getTableHeader().setReorderingAllowed(false); table.moveColumn(table.getColumnCount() - 1, 0); }
}</source>