Comment faire pour actualiser les données dans la JTable, je suis en utilisant TableModel
Salut,
J'ai créé mon TableModel et souhaitez actualiser JTable une fois j'ai ajouté une nouvelle ligne. Ce qui doit être ajouté à l'auditeur à "rafraîchir" JTable?
public class MyTableModel implements TableModel {
private Set<TableModelListener> listeners = new HashSet<TableModelListener>();
//List<Staff> staffs = Factory.getInstance().getStaffDAO().getAllStaff();
private List<Staff> staffs;
public MyTableModel(List<Staff> staffs){
this.staffs = staffs;
}
@Override
public int getRowCount() {
return staffs.size();
}
@Override
public int getColumnCount() {
return 5;
}
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex){
case 0:
return "First Name";
case 1:
return "Second Name";
case 2:
return "Date";
case 3:
return "Position";
case 4:
return "Salary";
}
return "";
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return Object.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Staff staff = staffs.get(rowIndex);
switch (columnIndex){
case 0:
return staff.getName();
case 1:
return staff.getSurname();
case 2:
return staff.getDate();
case 3:
return staff.getPosition();
case 4:
return staff.getSalary();
}
return "";
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
}
@Override
public void addTableModelListener(TableModelListener l) {
}
@Override
public void removeTableModelListener(TableModelListener l) {
}
}
Voici mon écouteur de mon Ajouter une rangée de boutons:
@Override
public void actionPerformed(ActionEvent e) {
Staff staff = new Staff();
staff.setName(JOptionPane.showInputDialog("Enter First Name"));
staff.setSurname(JOptionPane.showInputDialog("Enter Second Name"));
staff.setDate(JOptionPane.showInputDialog("Enter Date"));
staff.setPosition(JOptionPane.showInputDialog("Enter Position"));
staff.setSalary(JOptionPane.showInputDialog("Enter Salary"));
try {
Factory.getInstance().getStaffDAO().addStaff(staff);
} catch (SQLException e1) {
e1.printStackTrace();
}
!!!Here should be some code that will be firing my table after adding new row!!!
}
J'ai essayé d'utiliser la méthode firetabledatachanged() de AbstractTableModel dans mon actionPerformed() mais avec unluck, il est apparu ClassCastException.
Mise à JOUR de 1
WorkPlaceGui.java
public class WorkPlaceGui extends JFrame implements ActionListener {
AbstractTableModel model;
JTable jTable;
JScrollPane jScrollPane;
public WorkPlaceGui()throws SQLException{
List<Staff> staffs = Factory.getInstance().getStaffDAO().getAllStaff();
for(int i = 0; i < 0; i++) {
staffs.add(new Staff("First Name " + staffs.get(i).getName(), "Second Name " + staffs.get(i).getSurname(), "Date " + staffs.get(i).getDate(), "Position " + staffs.get(i).getPosition(), "Salary " + staffs.get(i).getSalary()));
}
model = new MyTableModel(staffs);
jTable = new JTable(model);
JButton jBtnAdd = new JButton("Добавить");
JButton jBtnDel = new JButton("Удалить");
JButton jBtnUpd = new JButton("Обновить");
JButton jBtnAdmin = new JButton("Админка");
JPanel panelNorth = new JPanel();
JPanel panelCenter = new JPanel();
JPanel panelSouth = new JPanel();
jTable.setPreferredScrollableViewportSize(new Dimension(350, 150));
jScrollPane = new JScrollPane(jTable);
panelNorth.setLayout(new FlowLayout());
panelNorth.add(jBtnAdd);
panelNorth.add(jBtnDel);
panelNorth.add(jBtnUpd);
panelNorth.add(jBtnAdmin);
panelCenter.add(jScrollPane);
setLayout(new BorderLayout());
add(panelNorth, BorderLayout.NORTH);
add(panelCenter, BorderLayout.CENTER);
jBtnAdd.addActionListener(this);
setPreferredSize(new Dimension(550, 300));
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setTitle("Staff data base");
pack();
setVisible(true);
setLocationRelativeTo(null);
}
@Override
public void actionPerformed(ActionEvent e) {
Staff staff = new Staff();
staff.setName(JOptionPane.showInputDialog("Enter First Name"));
staff.setSurname(JOptionPane.showInputDialog("Enter Second Name"));
staff.setDate(JOptionPane.showInputDialog("Enter Date"));
staff.setPosition(JOptionPane.showInputDialog("Enter Position"));
staff.setSalary(JOptionPane.showInputDialog("Enter Salary"));
try {
Factory.getInstance().getStaffDAO().addStaff(staff);
} catch (SQLException e1) {
e1.printStackTrace();
}
model.fireTableDataChanged();
}
}
MyTableModel.java
public class MyTableModel extends AbstractTableModel {
private List<Staff> staffs;
public MyTableModel(List<Staff> staffs){
this.staffs = staffs;
}
@Override
public int getRowCount() {
return staffs.size();
}
@Override
public int getColumnCount() {
return 5;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Staff staff = staffs.get(rowIndex);
switch (columnIndex){
case 0:
return staff.getName();
case 1:
return staff.getSurname();
case 2:
return staff.getDate();
case 3:
return staff.getPosition();
case 4:
return staff.getSalary();
}
return "";
}
}
pour mieux aider plus tôt post un SSCCE, bref, praticable, compilable, juste au sujet de JFrame avec JTable contient coder en dur la valeur pour TableModel, la question pourrait être n'importe où
OriginalL'auteur devger | 2013-05-28
Vous devez vous connecter pour publier un commentaire.
Que vous avez fait à la dure.
Tout d'abord, vous avez mis en œuvre directement à partir de
TableModel
et d'autre part, vous avez omis de mettre en œuvre l'auditeur exigences...Au lieu de cela, essayez l'extension de la
AbstractTableModel
à la place, qui comprend déjà les implémentations de l'auditeur, de l'enregistrement et de la notification.Vous devrez fournir une méthode qui vous permettra d'ajouter une ligne à la table de modèle. Dans cette méthode, vous devez utiliser le
fireTableRowsInserted
méthode qui permettra de notifier à toutes les tables à l'aide du modèle, qu'une nouvelle ligne a été ajoutée...Mise à jour avec exemple
C'est TRÈS, TRÈS basique, par exemple. C'est la seule intention est de démontrer l'utilisation de
fireTableRowsInserted
. Il utilise un SwingTimer
pour ajouter une nouvelle ligne tous les 125 millisecondes jusqu'à ce que vous le tuer 😉Mis à jour avec un autre exemple
Parce que votre modèle de table est soutenu par son propre
List
, il n'a pas de connexion à votre usine. Il ne sait pas quand vous ajoutez ou supprimez des objets. Cela signifie que vous devenez responsable de la mise à jour du modèle:Et votre
actionPerformed
:Je suis en supposant que le modèle a été fixé à la table en question?
Oui, de telle façon
jTable = new JTable(model);
J'avais vraiment besoin d'en voir davantage (travail) code pour être sûr...
MadProgrammer, je l'ai ajouté dans UPDATE1
OriginalL'auteur MadProgrammer
Votre classe
MyTableModel
implémenteTableModel
, mais il n'a pas de mécanisme de gestion d'événements pour connecter le modèle de la vue. Au lieu d'étendreAbstractTableModel
, comme le montre ici et ici.AbstractTableModel
fournit lafireTable*
les méthodes nécessaires pour cela.fireTableCellUpdated
dans lesetValueAt
méthode!Sans vergogne adapté à partir de tutoriel cité. 🙂
OriginalL'auteur trashgod
Bien, tout d'abord, trouver plus au sujet de pattern observer (http://en.wikipedia.org/wiki/Observer_pattern).
Je vous suggère de créer un ObservableModel classe qui aura une liste de PropertyChangeListeners. Votre StaffDAO devrait étendre cette ObservableModel. Lorsque le nouveau personnel est ajouté (c'est à dire
addStaff
est appelée), vous devez appeler ObservableModel defirePorpertyChange
ou quelque chose comme ça.firePropertyChange
notify
s toute propertyChangeListeners. L'un de ces auditeurs devraient être enregistrées à votre Table, et sonpropertyChanged
méthode doit être mis en œuvre avec l'actualisation de la table (hd1) avait une bonne réponse.PropertyChangeListener
est l'approche la plus appropriée car elle suggère qu'une seule propriété d'un objet a changé, d'où l'ajout ou la suppression suggère une plus grande exigence de modification -à mon humble avis. Il serait plus utile de fournir, si possible, une interface personnalisée qui pourrait fournir des informations plus explicites sur le changement d'état du modèle et inclus, les références à toutes les lignes qui ont été effectués, le rendant plus facile de déterminer exactement ce qui a changé (comme la ligne en question aurait pu être inséré à la place)OriginalL'auteur darijan
myTableModel.fireTableDataChanged();
devrait être juste assez pour forcer la mise à jour de votre table. Comme d'habitude, si vous avez d'autres problèmes, n'hésitez pas à laisser un commentaire.TableModel
n'ont pas defireTableDataChanged
et la seule application que je connaisse estprotected
Vous devez étendre DefaultTableModel, au lieu de le mettre en place vous-même.
Pas nécessairement.
fireTableDataChanged
vient deAbstractTableModel
, ce qui peut être mieux adapté (et à mon humble avis est souvent le cas pour les peuples exigences. Mon point est, l'OP a utiliséTableModel
que les bases de la il y a un modèle de table et il n'a pas defireTableDataChanged
, en tant que tel votre suggestion ne fonctionne pas. Bonne idée mais...est correcte; DefaultTableModel hérite de l'événement de la plomberie de AbstractTableModel, mais il appâts vous d'une technologie de cul-de-sac de java.util.Vecteur.
OriginalL'auteur hd1
Pour une solution générale, vous pouvez utiliser le Ligne Modèle De Table et de mettre en œuvre la getValueAt() et setValueAt() méthodes.
Le modèle est chargé d'invoquer la bonne fireXXX méthode.
OriginalL'auteur camickr
OriginalL'auteur Gandalf the white