L'appel Précédent Modèle de Comportement de la JTable.setModel()

Ont un JTable sur mon swing écran. Lors du chargement de l'écran, je suis en train d'un modèle de table qui est créé pour cette table.
Et au moment de l'exécution si il n'y a aucune modification de données, je suis recréer le même modèle et de nouveau ensemble à l'aide de objJTable.setModel(objCustTableModel).

Maintenant, le problème est un modèle de table qui est chargé à l'époque de l'écran de chargement, le même modèle objet appelé pendant le réglage objJTable.setModel(objCustTableModel) au moment de l'exécution qui a appelé getColumnClass(int col) méthode de CustTableModel classe. Après cet appel de l'objet, mon nouveau modèle de l'objet appelé. Encore si j'ai mis un autre nouveau
modèle de table, en utilisant le même code objJTable.setModel(objCustTableModel2), modèle d'appel de fonctions appelées d'abord à partir de objCustTableModel et puis
objCustTableModel2.

En bref setModel() fonction de premier appel précédent modèle objet et modèle actuel de l'objet. Comment puis-je limiter l'appel du précédent modèle objet?

Par exemple

import java.awt.Cursor;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
/**
* Steps to reproduce issue.
* 1. Run this program.
* 2. There will be two rows in table. Delete all rows one by one.
* 3. Now click on Add button and see the exception.
* 
* I come to know that this exception is because of table.setAutoCreateRowSorter(true); line, which is there in TestCustTableModel's constructor
* If you comment this line, then issue got resolved.
* But I want to apply sorting on columns so this line is required.
*/
public class TestCustTableModel extends JPanel{
JTable table = new JTable();
public TestCustTableModel() {
Object[][] data = new Object[2][3];
data[0][0] = "1";
data[0][1] = "User1";
data[0][2] = "Delete";
data[1][0] = "2";
data[1][1] = "User2";
data[1][2] = "Delete";
JButton addButton = new JButton("Add");
addButton.addMouseListener(new AddListener());
table.setModel(new CustModel(data));
table.addMouseListener(new TableListener());
/**#################################
* Following line throws ArrayIndexOutOfBoundsException. Please comment or Uncomment following line and see the difference.
*/
table.setAutoCreateRowSorter(true);
table.getTableHeader().setCursor(new Cursor(Cursor.HAND_CURSOR));
JScrollPane scrollPane = new JScrollPane(table);
this.add(addButton);
this.add(scrollPane);
}
class TableListener extends MouseAdapter {
public void mouseClicked(MouseEvent evnt) {
Point p = evnt.getPoint();
if(table.columnAtPoint(p) == 2) {
Object[][] data = null;
if(table.getModel().getRowCount() == 2 && table.rowAtPoint(p) == 0) {
data = new Object[1][3];
data[0][0] = "2";
data[0][1] = "User2";
data[0][2] = "Delete";
}else if(table.getModel().getRowCount() == 2 && table.rowAtPoint(p) == 1) {
data = new Object[1][3];
data[0][0] = "1";
data[0][1] = "User1";
data[0][2] = "Delete";
}else {
data = new Object[0][];
}
table.setModel(new CustModel(data));
}
}
}
class AddListener extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent evnt) {
if(table.getModel().getRowCount() == 2) {
return;
}
Object[][] data = new Object[table.getModel().getRowCount() + 1][3];
for(int i = 0; i <= table.getModel().getRowCount(); i++) {
data[i][0] = i;
data[i][1] = "User" + i;
data[i][2] = "Delete";
}
table.setModel(new CustModel(data));
}
}
class CustModel extends AbstractTableModel {
private String[] columnNames = {"ID", "NAME", "DELETE"};
private Object[][] data = null;
public CustModel(Object[][] data) {
this.data = data;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public Class getColumnClass(int col) {
return getValueAt(0, col).getClass();
}
}
private void display() {
JFrame f = new JFrame("SwapTableModel");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
TestCustTableModel obj = new TestCustTableModel();
obj.display();
}
}

à cette époque swing d'abord en interne appelé getColumnClass fonction sur la base de objCustTableModel et après que
à l'aide de objCustTableModel2 objet. Je veux restreindre l'appel qui est sur la base de objCustTableModel.

Post code au lieu de décrire votre code en anglais (que je suis incapable de le comprendre pour l'instant). Publier une SSCCE et nous montrer où vous êtes coincé.
édité question
veuillez whats Override following function to show buttons voulez-vous montrer JButtons dans JTable, puis est stocké Chaîne de valeur description pour JButton dans le modèle, vraiment ce que vous voulez faire ....
"édité question" Où est le SSCCE?
J'ai ajouté quelques icônes dans JTable pour modifier et de supprimer la ligne sélectionnée, qui fonctionne bien.

OriginalL'auteur Navnath | 2013-04-16