• Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

How to change from AbstractTableModel to DefaultTableModel

Dinesh Ramaswamy
Posts: 13
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I have pasted the code below which makes use of Abstract table model.This code is an example of a table that has first 2 columns fixed and scrollable from the 3rd column.
Can anyone pls tell me now how should I do the same with DefaultTableModel with respect to the code given.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;

public class FixedColumnExample extends JFrame {

Object[][] data;
Object[] column;
JTable fixedTable,table;

public FixedColumnExample() {

super( "Fixed Column Example" );

setSize( 400, 150 );

data = new Object[][]{
column = new Object[]{"fixed 1","fixed 2","a","b","c","d","e","f"};

AbstractTableModel fixedModel = new AbstractTableModel() {
// We have two fixed rows so report 2 columns from data
public int getColumnCount() { return 2; }
public int getRowCount() { return data.length; }
public String getColumnName(int col) { return (String)column[col]; }
// As only the first two columns are reported this can stay
// the same
public Object getValueAt(int row, int col) { return data[row][col]; }

AbstractTableModel model = new AbstractTableModel() {
// This model has two less columns in the data as two are
// fixed
public int getColumnCount() { return column.length -2; }
public int getRowCount() { return data.length; }
public String getColumnName(int col) {
// The columns start 2 on in the data
return (String)column[col +2];
public Object getValueAt(int row, int col) {
// The first two column are for the fixed table so return
// data after by adding 2
return data[row][col+2];
public void setValueAt(Object obj, int row, int col) {
// As above
data[row][col +2] = obj;
public boolean isCellEditable(int row, int col) { return true; }

fixedTable = new JTable( fixedModel ) ;
ListSelectionModel lsm = fixedTable.getSelectionModel();
lsm.addListSelectionListener(new SelectionListener(true));

table = new JTable( model ) ;
lsm = table.getSelectionModel();
lsm.addListSelectionListener(new SelectionListener(false));

JScrollPane scroll = new JScrollPane( table );
JViewport viewport = new JViewport();

getContentPane().add(scroll, BorderLayout.CENTER);

class SelectionListener implements ListSelectionListener {

boolean isFixedTable = true;

public SelectionListener(boolean isFixedTable) { this.isFixedTable = isFixedTable; }

public void valueChanged(ListSelectionEvent e) {

if (isFixedTable) {
int fixedSelectedIndex = fixedTable.getSelectedRow();
else {
int selectedIndex = table.getSelectedRow();

public static void main(String[] args) {
FixedColumnExample frame = new FixedColumnExample();
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
Avi Abrami
Ranch Hand
Posts: 1141
Java Oracle
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi Dinesh,
In the code you have posted, you are creating an 'anonymous' subclass of "javax.swing.table.AbstractTableModel" which starts with this line (of your code):

The java compiler will create a "FixedColumnExample$1.class" file containing the definition of your anonymous class that extends "AbstractTableModel".
An alternative is to create a named class that extends "AbstractTableModel":

In other words, replace the anonymous definition with a named definition.
Now exactly the same way as you create a class that extends "AbstractTableModel", you can create a class that extends "DefaultTableModel":

As detailed in the javadoc for "DefaultTableModel":
it uses a "Vector" of "Vector"s to contain the data. Therefore, to extract the entire first row of the "JTable", use:

and to get the data in the third column of your "JTable", use:

Hope this has helped you.
Good luck,
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic