2011-12-31 1 views
0

Dans mon programme, je charge un JTextArea pour afficher du texte lorsque je clique sur un bouton. J'ai ajouté le ActionListener et écrit une méthode loadQuestion(), mais pour une raison quelconque, le composant n'est pas mis à jour. Le composant est contenu dans un autre fichier auquel j'accède via les méthodes get() et set(). J'ai exécuté les méthodes repaint() et revalidate() dans la méthode loadQuestion() et de nouveau dans la méthode setTextArea(), mais cela ne semble toujours pas fonctionner !! Tous les pointeurs seraient appréciés - merci à l'avanceMise à jour de JTextArea en Java

public void loadQuestion() { 
    JTextArea tempArea = quizDisplay.getTextArea(); 
    String text = "Hello World!!"; 
    tempArea.append("Hi"); 
    quizDisplay.setTextArea(tempArea); 
    quizDisplay.revalidate(); 
    quizDisplay.repaint(); 

} 
+3

Je ne pense pas que votre question est actuellement responsable compte tenu de l'information qui a été présentée jusqu'à maintenant, nous avons besoin de plus d'information pour nous aventurer plus que de simples suppositions. Je vais deviner quand même - êtes-vous sûr que l'objet quizDisplay sur lequel vous appelez des méthodes est celui qui est affiché? Si cela ne vous aide pas, envisagez sérieusement de nous donner plus d'informations, de préférence un [sscce] (http://sscce.org). Notez également qu'une fois que vous avez ajouté du texte ou défini du texte sur un JTextArea, il s'affiche et les appels à 'revalidate()' et 'repaint()' sont complètement inutiles. –

+0

Essayez d'ajouter quizDisplay.updateUI(). Vous êtes sûr que cette méthode est appelée correctement? – kosa

+0

En outre, puisque vous obtenez le JTextArea de l'objet quizDisplay, je doute que vous ayez besoin de le renvoyer via votre méthode 'setTextArea (...)', car il est probablement déjà "défini" comme JTextArea de l'objet. Encore une fois, cela ne peut être qu'une supposition, car nous manquons des pièces importantes à votre puzzle. –

Répondre

6

Normalement, lorsque vous ajoutez un texte à un JTextArea visible, il n'y a pas besoin d'appeler revalidate ou repaint vous. Le JTextArea sait qu'il a été changé, et prendra soin de sa repeindre. Il n'est pas nécessaire de redéfinir la zone de texte.

En outre, toutes les opérations liées à Swing doivent se produire sur le EDT (Event Dispatch Thread).

donc votre code finirait par ressembler à

public void loadQuestion() { 
    JTextArea tempArea = quizDisplay.getTextArea(); 
    tempArea.append("Hi"); 
} 

et la méthode loadQuestion devrait être appelé à l'EDT qui est normalement le cas quand il est appelé à partir du ActionListener lorsque le bouton est pressé.

Vérifiez la Swing tutorial pour un exemple de using a JTextArea, où ils font plus ou moins la même chose (une citation du code source à laquelle je lié)

public void actionPerformed(ActionEvent evt) { 
    String text = textField.getText(); 
    textArea.append(text + newline); 
    textField.selectAll(); 

    //Make sure the new text is visible, even if there 
    //was a selection in the text area. 
    textArea.setCaretPosition(textArea.getDocument().getLength()); 
} 
+0

Je suis d'accord qu'il n'y a pas besoin d'appeler 'revalidate' ou' repaint' (voir mes commentaires à la question originale car il dit la même chose), mais d'autre part, aucun de ces appels ne causera jamais le problème du poster original. Votre réponse donne de bonnes suggestions, mais ne parvient pas à résoudre le problème original, un problème qui, à mon avis, ne peut être résolu sans plus d'informations. –

+0

J'étais dans le doute si pour le signaler comme réponse ou comme commentaire, mais c'était un peu long pour un commentaire. Quand/si la question est mise à jour et que ma réponse n'est pas pertinente, je n'ai aucun problème à la supprimer à nouveau – Robin

+0

Je ne voudrais pas la supprimer à nouveau, elle donne des suggestions correctes et utiles. 1+ vote pour ceux-là. Mais nous devrons attendre pour voir si le PO reviendra jamais et nous donnera plus d'informations avant que nous puissions trouver ce que la solution au problème original devrait être. –