2011-06-21 3 views
0
... 
float value = Float.parseFloat((String)model.getValueAt(e.getLastRow(), 1));    
DecimalFormat dec = new DecimalFormat("#.###"); 
model.setValueAt(dec.format(value), e.getLastRow(), 1); 
... 

à la troisième ligne j'obtiens l'exception stackOverflowError. Ce que j'ai l'intention de faire est d'obtenir une valeur de cellule JTable à partir d'un objet, en le convertissant en un flottant, en le limitant à 3 décimales, et enfin convertir en chaîne et définir la valeur avec 3 décimales à la cellule.Java StackOverflowError

Je suppose que le problème est que je change la valeur et que j'entre la fonction encore et encore. Donc, le StackOverflow est dû à cela. La question est, comment puis-je résoudre ce problème?

fonction complète à: Java: Converting data types (Désolé pour l'affichage deux fois ... Il était une autre question, et la solution m'a conduit à un autre problème)

+2

Êtes-vous sûr que vous n'êtes pas vous appelez à plusieurs reprises provoquant l'erreur? Quelle est la trace de pile actuelle? –

+0

Je sais que le problème vient du fait que setValueAt déclenche un autre événement tableChanged(). Mais je ne sais pas comment l'éviter! –

+0

Copie possible de [Qu'est-ce qu'un StackOverflowError?] (Http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror) – Raedwald

Répondre

3

Le problème est que setValueAt() sera, dans le cadre de sa mise en œuvre appelez tableChanged() sur tous les écouteurs enregistrés, y compris celui-ci. Pour éviter ceci, vérifiez simplement si la valeur dans la cellule est déjà dans le format désiré comme première chose dans votre méthode, et ne faites rien si c'est le cas.

+0

C'est tout! Merci! :) –

+1

@Roman Rdgz: Envisager d'accepter cette réponse si elle a résolu votre problème. – spot35

+0

Toujours l'air un peu un hack :) –

1

Appelez simplement model.setValueAt() si la valeur de la cellule n'est pas modifiée. Il devrait arrêter la récursivité.

1

Je pense que cette tâche est généralement accomplie en définissant un éditeur personnalisé sur la table. Alors qu'il formate toutes les données d'entrée dans un formulaire désiré. Voir this réponse.

0

Peut-être vous avez besoin quelque chose comme

String text = (String) model.getValueAt(e.getLastRow(), 1); 
String text2 = new DecimalFormat("#.###").format(Float.parseFloat(text)); 
if (!text.equals(text2)) 
    model.setValueAt(dec.format(value), e.getLastRow(), 1); 
Questions connexes