2011-02-14 5 views
0

Lorsque la page avec l'applet est chargée, le contenu de l'objet JTable est rendu parfaitement. Lorsque je ferme un onglet et le rouvre, le contenu défini au démarrage est rendu, mais lorsque le contenu que j'ai modifié via la table setValeAt() devient vide. Lorsque je supprime toutes les balises html du modèle de données tout fonctionne. Je ne fais rien avec le moteur de rendu implicite de table seulement le modèle de données implicite. Toutes les valeurs sont définies via setValeAt() et cela fonctionne (je l'ai vérifié). Quelqu'un peut-il avoir une idée de ce qui pourrait se passer?JTable ne rend pas

Voici un exemple de code qui reproduit l'erreur. Lancez l'applet (les valeurs changeront), puis fermez l'onglet (NOT browser) et rouvrez-le. Je l'ai testé dans Firefox 3.6.13 et Java 1.6.0_22-b04 sous Linux et Windows XP. Il agit de la même manière.

import javax.swing.JApplet; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 

public class test extends JApplet 
{ 
    class model extends AbstractTableModel 
    { 

     @Override 
     public int getColumnCount() 
     { 
      return 3; 
     } 

     @Override 
     public int getRowCount() 
     { 
      return 3; 
     } 

     @Override 
     public Object getValueAt(int arg0, int arg1) 
     { 
      return "<html><b>" + Math.random() + "</b></html>"; // does not work 
      //return "" + Math.random(); // work 
     } 

     public void setValueAt(Object newValue, int row, int col) 
     { 
      fireTableCellUpdated(row, col); 
     } 
    } 

    JTable t = new JTable(); 

    public void init() 
    { 
     t.setModel(new model()); 
     add(t); 
    } 

    public void start() 
    { 
     new Thread(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       int i=0; 
       try 
       { 
        while(++i<100) 
        { 
         Thread.sleep(100); // thanks to camickr 
         t.setValueAt(Void.class, (int)(Math.random()*10) %3, (int)(Math.random()*10) %3); 
        } 

       } 
       catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 
} 

EDIT:

code HTML applet dans index.html

 
<applet width="500px" height="500px" alt="test test test" code="test.class">
</applet>

Code de compilation: javac test.java

produit: fichiers test$1.class test.class test$model.class

Première exécution OK. Faites un nouvel onglet, puis fermez l'onglet de l'applet. Reouvrez l'onglet de l'applet (ne fermez pas le navigateur) et le contenu de la table ne s'affiche pas.

EDIT 2
IT EST UN JVM! voir http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6995386 et d'autres connexes. Cela n'affecte que JRE 1.6.0_22

Répondre

1

Je n'ai pas pu reproduire le problème en utilisant JDK6_7 sous XP.

valeurs

vont changer

Les valeurs ne tiennent pas changer puisque vous ne dormez pas après chaque mise à jour du modèle. J'ai légèrement changé le code:

// Thread.sleep(100); 

while(++i<100) 
{ 
    t.setValueAt(Void.class, (int)(Math.random()*10) %3, (int)(Math.random()*10) %3); 
    Thread.sleep(500); 
} 
+0

Vous avez raison, mon erreur. Confirmez-vous ce comportement étrange? – BeginEnd