Auto refresh d'une JTable sur Jinternal JDK1.5
Bonjours,
Je sèche depuis plusieur jours sur un problème thread en JDK 1.5 et je voudrais bien le faire avec Thread ou runnable sans utiliser la classe Swingworker et ce pour bien comprendre les Threads.
Dans une JInternalFrame qui display un tableau resultat d'un SQL, je souhaite activer une fonction auto refresh.
Probleme un : il peut exister plusieur occurence de ce JInternal frame qui pointent chacune sur une DB differente.
Probleme deux : j'ai suivit le tutorial Thread gfx, lu ce forum mais mon code bloque mon interface. Je cherche l'erreur mais je ne la vois pas:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
public class frame_streams_configuration extends JInternalFrame implements ActionListener {
// Ne devrais pas declarer private static ? Attention car j'ai plusieures occurences de JTable ?
private Jtable_sort ts_apply;
private JFormattedTextField tfAutoApp; // Formated TF sera restreint aux entiers
.
.
.
// la fonction actionlistener :
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(jbExportDataDict)) { // un autre objet
do_jbExportDataDict();
} else if (e.getSource().equals(tfAutoApp)) {
do_autoRefreshApp(); // la ligne qui nous interresse
.
.
.
}
private void do_autoRefreshApp() {
if ( tfAutoApp.getText().length() > 0 ) {
threadApp = new Thread(new Runnable() {
public void run() {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
cpt=0;
while (tfAutoApp.getText().length() > 0) {
try {
populate_apply();
} catch (SQLException e) {
System.out.println("C1:="+e);
}
try {
Thread.sleep(2000) ;
} catch (InterruptedException e) {
System.out.println("Catch:="+e);
}
System.out.println("After sleep cpt="+ ++cpt);
}
}
});
System.out.println("Thread Done"+cpt);
}
} ); // end thread
threadApp.start();
}
} |
Des que je met une valeur dans auto je vois bien que le tread demarre, mais je n'ai plus la main sur mon interface. Pourtant j'utilise bien 2 runnable et invokelater. je fait appel a la fonction populate_apply dans invokeLater alors ou est le bug?
La fonction Populate_apply:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
private void populate_apply() throws SQLException {
if (ts_apply == null){
ts_apply = new Jtable_sort(conn,"",12); // Creer Obejct JTable et lui associe un SQL et avec un connection Oracle
.
.
}
Vector data = ts_apply.run_sql(conn, "select ... from table... " );
if ( data != null){
ts_apply.model.getDataVector().clear();
ts_apply.model.setDataVector(data,ts_apply.columnNames);
} |
Autre le fait que mon interface ce bloque, je me demande si a chaque call de populate_apply, je ne cree pas une nouvelle occurence de ma table ts_apply.
Et je ne suis pas satisfait du tout de ma declaration du thread: Des qu'on met la vameur du JFormattedText 'tfAutoApp' a 0, le Thread doit s'arreter.