JTable ligne d'Insertion et de rafraîchissement
Je suis en train de créer simple demande où JTable est mis à jour et actualisé fois que les données ont changé.La Structure est comme suit.
1)la Classe Principale qui contient JFrame,JTable détails.
2)SampleTableModel classe qui extends AbstractTableModel.Je suis substituant la plupart des méthodes.
import javax.swing.table.*;
import java.util.*;
public class SampleTableModel extends AbstractTableModel {
public SampleTableModel() {
//this.addTableModelListener(
}
String[] columnNames = {"A", "B", "C", "D", "E"};
int[][] data = {{1, 2, 3, 4, 5}, {5, 6, 7, 8, 9}, {12, 13, 14, 15, 16}};
Vector dataVector = new Vector();
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
public int getColumnCount() {
return 5;
}
public int getRowCount() {
return 3;
}
public String getColumnName(int columnIndex) {
return columnNames[columnIndex];
}
public void setValueAt(Object value, int row, int column) {
data[row][column] = 99;
}
public void notifyTable(AEMessage message) {
/*
* This method will be called from another class to update JTable.
* */
data[0][1] = 999;
data[0][2] = 8838;
data[1][1] = 8883;
fireTableRowsUpdated(0, 3);
}
}
Comme vous pouvez le voir, notifyTable sera appelée à partir d'une autre classe(qui est en fait un thread qui appelle cette méthode fréquemment)
Le problème est que je ne vois pas de données à modifier dans JTable.Je ne vois que les données initialisées.
Dans la classe Principale - je suis comme ce-
RVJDataTable.setModel(new SampleTableModel());
Je suis en utilisant DefaultTableModel plutôt Abstrait pour insérer des données.
Cela est-il principal de la classe JTable-
import javax.swing.event.TableModelListener;
import javax.swing.event.TableModelEvent;
public class MainWindow extends javax.swing.JFrame implements TableModelListener {
public MainWindow() {
initComponents();
}
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
// RVTableModel model = new RVTableModel();
TableModelWrapper wrap = new TableModelWrapper();
RVDataTable = new javax.swing.JTable();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
RVDataTable.setModel(wrap.getModel());
RVDataTable.getModel().addTableModelListener(this);
//RVDataTable.
jScrollPane1.setViewportView(RVDataTable);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(57, 57, 57)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 552, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(105, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(25, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 193, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(82, 82, 82))
);
pack();
}//</editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainWindow().setVisible(true);
}
});
}
public void tableChanged(TableModelEvent evt){
System.out.println(evt.getFirstRow());
}
//Variables declaration - do not modify
private javax.swing.JTable RVDataTable;
private javax.swing.JScrollPane jScrollPane1;
//End of variables declaration
}
Classe suivante est utilisée pour définir DefaultTableModel:
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.*;
public class TableModelWrapper {
public DefaultTableModel getModel(){
Vector dataVec = new Vector();
String[] arr = {"ABS","ASAAS","ASAsA","AsaSA"};
Vector rowVec = new Vector();
for(int i=0;i<4;i++)
rowVec.add(i,arr[i] );
for(int i=0;i<5;i++)
dataVec.add(i, rowVec);
Vector columnNames = new Vector();
columnNames.add("FIRST");
columnNames.add("SECOND");
columnNames.add("THIIRD");
columnNames.add("FOURTH");
//columnNames.add("FIFTH");
DefaultTableModel model = new DefaultTableModel(dataVec,columnNames);
return model;
}
public Object[] getRecord(){
String[] arr = {"hhaHHA","HHHDS","NHHHSS","PQPPPQ"};
return arr;
}
}
et suivants de la classe ajoute enregistrement toutes les 5 secondes à l'aide d'Actions de la classe.
public class Updater {
public static void main(String[] args){
Stock stock =new Stock();
stock.start();
}
}
classe d'Actions extends Thread{
//RVTableModel model = null;
TableModelWrapper wrap = null;
public Stock(){
wrap = new TableModelWrapper();
}
public void run(){
try{
while(true){
wrap.getModel().addRow(wrap.getRecord());
wrap.getModel().fireTableRowsInserted(wrap.getModel().getRowCount() +1,wrap.getModel().getRowCount()+1);
sleep(5000);
}
}
catch(InterruptedException e){
System.out.println(e);
}
}
}
Je ne vois pas JTable obtenir des mises à jour.
Vous devez vous connecter pour publier un commentaire.
Basé sur le code fourni, il semble comme il devrait fonctionner, mais le code n'est pas complet donc je ne peux pas dire à coup sûr. Peut-être que votre classe "autres" est une référence à la mauvaise TableModel?
Aussi, il n'y a rien de spécial à propos de vos données, alors pourquoi ne pas utiliser le DefaultTableModel. Vous pouvez ensuite mettre à jour la table à l'aide de:
Si vous avez besoin de plus d'aide pour poster votre SSCCE.
En général, le Swing n'est pas thread-safe. Pensez à utiliser
EventQueue.invokeLater()
, mentionné ici.Addendum: compte tenu de mise à jour de votre exemple, essayez quelque chose comme ceci:
Addendum:
SwingWorker
, discuté ici est un autre moyen alternatif de la mise à jour de l'interface graphique à partir d'un autre thread.EventQueue.invokeLater()
.