Estes erros estão lhe dizendo o que você já intuiu antes: Que não existe um método addColumn(String) e nem um insertColumn(String) para a sua classe ResultSetTableModel. Para ter um desses métodos, você mesmo terá que criá-los na sua classe, uma vez que, como você mesmo percebeu antes, estes métodos não são providos por AbstractTableModel.
Quanto a extender de DefaultTableModel, não há a necessidade, só porque esta classe tem os métodos que você tá querendo. Você pode continuar deixando sua ResultSetTableModel como uma AbstractTableModel, sem problemas. Só que você terá um pouco mais de trabalho para criar a classe, só isso. Bom pra praticar.
Sugiro a você que estude diretamente o código fonte da classe javax.swing.table.DefaultTableModel, e se norteie pelas implementações ali contidas para fazer as suas.
Na pior das hipóteses, faça o seguinte: Faça a sua classe herdar de DefaulTableModel mesmo. Implemente tudo o que você tem que implementar, deixe tudo funcionando. Depois disso, troque o “extends DefaultTableModel” por “extends AbstractTableModel”. Vai ser um bom exercício pra entender melhor como implementar um Table Model.
Vou mandar aqui um Table Model que fiz certa vez para ajudar uma colega nossa aqui do fórum.
Divirta-se!
/**
* @author Mantu
*/
package help.guj.lina;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.AbstractTableModel;
public class StackTableModel<T> extends AbstractTableModel {
private List<T> data;
private String stackName;
public StackTableModel(String stackName) {
data = new ArrayList<T>();
stackName = stackName == null ? "Stack" : stackName;
}
public String getStackName() {
return stackName;
}
public int getColumnCount() {
return 1;
}
public int getRowCount() {
return data.size();
}
public Object getValueAt(int row, int column) {
if(row >= 0 && row < data.size())
return data.get(row);
return null;
}
public T peek() {
if(data.isEmpty())
return null;
return data.get(0);
}
/**
* It will never happen..
*/
@Deprecated
public void setValueAt(Object aValue, int row, int column) {
}
public boolean isCellEditable(int row, int column) {
return false;
}
public void push(T datum) {
data.add(0, datum);
fireTableRowsInserted(0, 0);
}
/**
* Use <code>getStackName</code> instead.
*/
@Deprecated
public String getColumnName(int column) {
return getStackName();
}
public T pop() {
T result = null;
if(!data.isEmpty()) {
result = data.remove(0);
fireTableRowsDeleted(0, 0);
}
return result;
}
public Class<?> getColumnClass(int columnIndex) {
return this.getClass().getTypeParameters()[0].getGenericDeclaration();
}
}
class StackTableModelTest{
public static void main(String[] args) {
final JTable tbl = new JTable(new StackTableModel<String>("Stack"));
final JScrollPane scrl = new JScrollPane(tbl);
final JTextField txt = new JTextField();
final JButton btnIns = new JButton("Push");
final JButton btnRmv = new JButton("Pop");
final JFrame frm = new JFrame("Simple Stack Table");
txt.setBorder(new TitledBorder(new EtchedBorder(), "Type the element here"));
txt.setForeground(new Color(0, 0, 255));
txt.setFont(new Font("Arial Bold", Font.BOLD | Font.ITALIC, 16));
txt.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnIns.doClick();
}
}
);
txt.addKeyListener(
new KeyAdapter() {
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_PAGE_UP:
btnRmv.doClick();
break;
case KeyEvent.VK_PAGE_DOWN:
btnIns.doClick();
break;
}
}
}
);
btnIns.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(txt.getText().length() > 0) {
StackTableModel<String> model =
(StackTableModel<String>)tbl.getModel();
String str = txt.getText();
model.push(str);
txt.setText("");
txt.grabFocus();
}
}
}
);
btnRmv.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
StackTableModel<String> model = (StackTableModel<String>)tbl.getModel();
model.pop();
txt.grabFocus();
}
}
);
tbl.setBackground(new Color(215, 215, 215));
tbl.setForeground(new Color(0, 0, 255));
tbl.setFont(new Font("Tahoma", Font.BOLD, 12));
JPanel pnl = new JPanel(new GridLayout(1, 2));
pnl.setSize(400, 50);
pnl.add(btnIns);
pnl.add(btnRmv);
final int GAP = 5;
final int TITLE_GAP = 30;
txt.setBounds(GAP, GAP, 300, 53);
pnl.setBounds(txt.getX(), txt.getY() + txt.getHeight() + GAP, txt.getWidth(), 35);
scrl.setBounds(pnl.getX(), pnl.getY() + pnl.getHeight() + GAP, pnl.getWidth(), 150);
Container c = frm.getContentPane();
c.setLayout(null);
c.add(txt);
c.add(pnl);
c.add(scrl);
frm.setSize((int)(txt.getWidth() + 3*GAP), TITLE_GAP + scrl.getY() + scrl.getHeight() + GAP);
frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frm.setVisible(true);
}
}