2014-07-19 3 views
-1

Je dois rester concentré sur JTextField. L'application utilise la bibliothèque Swing. J'ai besoin de mettre l'accent sur ce domaine de temps en temps afin d'éviter les erreurs de l'utilisateur qui changeraient de point de vue pour d'autres comonents. Je suppose que j'ai besoin d'utiliser SwingWorker. Définir le focus est une opération sur le composant Swing , il doit donc être appelé dans EDT. Ma question est comment écrire SwingWorker pour faire cela? Je sais que la méthode done() passe les tâches à appeler dans EDT mais j'ai besoin que cette tâche soit invoquée chaque fois que nous passons 2 secondes. La méthode done() est appelée une fois. Alors peut-être que ça va aller comme ça?Comment garder le focus sur JTextField. SwingWorker

public class myWorker extends SwingWorker<Void, Void> { 

@Override 
protected Void doInBackground() throws Exception { 
SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
    //here set focus on JTextField 
    return null; 
    } 
}); 
}} 

Edit:

I a remarqué que le processus de méthode() qui est une partie de SwingWorker peut être approprié beacuse elle est appelée dans EDT. Je ne suis pas sûr mais cette méthode est probablement invoquée toujours quand j'appelle publish() metod. Alors pourriez-vous me dire si ce code est valide pour faire cette tâche?

private class KeepFocusWorker extends SwingWorker<Void, Void> 
{ 
    @Override 
    protected Void doInBackground() throws Exception 
    { 
     while(true) 
     { 
      publish(); 
     } 
    } 

    @Override 
    protected void process(List<Void> chunks) 
    { 
     codeBar.requestFocusInWindow(); 
    } 
} 
+0

* "Alors peut-être sth .." * ..Sith? Sud? La paresse? Tapez toutes les lettres des mots plutôt que de faire deviner les gens. –

+1

Focus est un guide pour l'utilisateur. Plutôt que de spéculer sur une mauvaise solution, expliquez ce que vous voulez accomplir et ce que vous avez essayé. Voir aussi [* Comment utiliser Swing Timers *] (http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html). – trashgod

+0

Ok. J'ai édité mon post pour être plus clair. – user2374573

Répondre

1

Utilisation javax.swing.Timer au lieu de SwingWorker. Dans ce cas, actionPerformed sera exécuté dans EDT. Pour définir le focus dans un composant, vous devez également appeler le requestFocus. Comme son nom l'indique, il s'agit d'une demande uniquement et non garantie. Donc, vous pouvez changer votre approche.

Timer timer = new Timer(2000, new ActionListener() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     codeBar.requestFocus(); 
    } 
}); 

timer.setRepeats(true); 
timer.start(); 
+0

Merci pour votre avis. Il est bon de savoir à propos de cette solution et finalement j'ai décidé que cette tâche devrait être faite le plus souvent possible (donc plutôt Thread ou SwingWorker). – user2374573

+1

'SwingWorker' n'est pas destiné aux tâches répétitives. C'est pour exécuter des tâches qui prennent beaucoup de temps dans le thread de travail. Pour exécuter du code plusieurs fois dans EDT, utilisez 'javax.swing.Timer'. J'ai mis à jour le code ci-dessus pour cela. – spgodara

1

Sûrement, il est préférable de limiter la capacité de l'utilisateur à se concentrer sur le champ de texte en premier lieu? Personnellement, je ne vois pas pourquoi c'est un problème, mais je suppose qu'il est préférable de garder le focus sur l'un des composants plutôt que de laisser l'utilisateur se concentrer uniquement pour que l'image soit remise toutes les quelques secondes. Par conséquent, vous pouvez ajouter un FocusListener au composant, remplacer la méthode focusLost et fondamentalement requestFocus() à nouveau.

codeBar.addFocusListener(new FocusAdapter() { 
    public void focusGained(FocusEvent e) { 
    } 
    public void focusLost(FocusEvent e) { 
     codeBar.requestFocus(); 
    } 
}); 

NB Je n'ai pas encore essayé cela mais je ne vois pas pourquoi cela ne fonctionnerait pas.

Vous pouvez également utiliser un InputVerifier qui renvoie toujours false pour empêcher la suppression de la mise au point.

+0

Merci, pour conseil. La raison en était que je voulais arrêter ce fil quand l'attention était requise pour seulement 2 autres domaines. J'ai beaucoup de champs de texte dans mon panel mais l'attention n'est acceptable que dans 2 d'entre eux. Mais comme nous le savons il y a beaucoup d'autres méthodes pour perdre le focus afin que le fil préserverait de cela. Enfin, j'ai décidé d'utiliser FocusListeners et de définir setFocusable (false) sur tout autre composant – user2374573

Questions connexes