2016-09-04 14 views
0

J'ai une petite application qui trouve des "résultats" très rapides (le type de résultat n'est pas important ici, mais parfois plus de 10 par seconde) et je veux les afficher à l'utilisateur sous forme de tableau forme ou quelque chose de similaire. J'utilise un swing JTable (à l'intérieur d'un JFrame) pour cela, insérez le nouveau résultat en tant que nouvelle ligne, puis exécutez une méthode pour redescendre à nouveau.Swing update lags

Object[] data = new Object[6]; 
    //fill data-array 
    ((DefaultTableModel) resultTable.getModel()).addRow(data); 
    resultTable.scrollRectToVisible(resultTable.getCellRect(resultTable.getRowCount(), 0, false)); 

Ce fait le travail en quelque sorte, mais swing semble être un peu laggy lorsque la mise à jour de la vue, de sorte que la plupart du temps (en raison de l'énorme quantité de repaints) les lignes de la table semblent pépin autour de la fenêtre .

Avez-vous des idées sur la façon de prévenir cela? Comme la synchronisation avec certains verrous de peinture internes/en utilisant une méthode différente pour afficher les résultats?

Répondre

2

Impossible de dire ce qui ne va pas sans code pertinent, mais je suppose que vous faites un traitement qui prend du temps sur le fil de l'événement Swing (s'il vous plaît montrer plus, donc nous n'avons pas à deviner). Si c'est le cas, la solution consiste à utiliser un SwingWorker pour vous permettre d'effectuer un traitement sur un thread d'arrière-plan tout en mettant à jour l'état Swing sur le thread d'événement Swing ou EDT. Par exemple, vous pouvez obtenir vos données dans une boucle dans la méthode doInBackground() de SwingWorker, puis utiliser publish/process pour insérer chaque ligne de données dans le modèle de JTable.

Pour en savoir plus, s'il vous plaît voir: Lesson: Concurrency in Swing

Si vous avez besoin d'une aide plus spécifique, alors s'il vous plaît envisager de créer et afficher votre Minimal, Complete, and Verifiable Example Program.

+0

Je pense que cela pourrait être le problème. Je vais y jeter un coup d'oeil, merci pour la réponse rapide. –