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
.
é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
Vous devez vous connecter pour publier un commentaire.
À partir de cette exemple, je n'ai pas vu un comportement inattendu avec la
getColumnClass()
mise en œuvre illustré ci-dessous.Noter que
JTable
peut invoquergetColumnClass()
à tout moment, il détermine qu'une cellule a besoin de rendu. Si nécessaire, vous pouvez utiliserEventQueue.invokeLater()
de planifier quelque chose qui va arriver après tout, en attendant les événements sont traités."Addenda:
Si
getAutoCreateRowSorter()
esttrue
,setModel()
tente de rétablir l'RowSorter
créé à l'aide de l'ancien modèle.Vous pouvez spécifier
setAutoCreateRowSorter(true)
après vous de changer les modèles, comme indiqué ci-dessous, ou de prolonger votreTableModel
de mettre à jour le modèle en place, comme le montre ici.Utilisation
ActionListener
pourJButton
au lieu deMouseListener
.Utiliser un
TableCellEditor
pour les boutons du tableau, comme le montre ici et ici.Code:
setModel()
premiers appelsgetColumnClass()
fonction à partir de l'ancien objet et à la deuxième fois, il appelle de nouveau modèle d'objet. Et c'est mon problème. Je veux juste appelergetColumnClass()
ne fonctionne qu'avec le nouveau modèle objet.href="http://stackoverflow.com/a/6233119/714968">vous pouvez à hardocde getColumnClass
cette question est valable pour tous les Auditeurs et les déclarants ajouté à JTable ou son Modèle, ont pour supprimer tous ces Objets avant de passer à la nouvelle ou à un autre XxxTableModel, parce que ces références sont toujours valables, alors il est concurency intermédiaires modèle, que la génération de toutes les exceptions possibles, btw, bonne question, mon +1
hushhh... c'est fait et fonctionne très bien.... Grâce mKorbe pour votre soutien...
c'est la raison pour laquelle nous l'avons en demandant SSCCE dans tous les cas, simple sans fin ...., phaaaaa comme vous pouvez le voir sur ce post 🙂
OriginalL'auteur trashgod
OriginalL'auteur Arjun Chaudhary