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
Vous avez raison, mon erreur. Confirmez-vous ce comportement étrange? – BeginEnd