2009-08-05 6 views
1

Lorsque j'utilise setSelectedComponent ou setSelectedIndex sur un objet JTabbedPane, le panneau apparaît toujours dans mon interface utilisateur. Cependant, parfois l'onglet associé au panneau reste caché. En d'autres termes, l'onglet ne défile pas vers une partie visible du volet à onglets.Mettre l'onglet en avant dans JTabbedPane

Comment puis-je résoudre ce problème? J'ai essayé le cheesy sélectionner un index, puis sélectionnez l'index désiré, ainsi que plusieurs autres choses plus élégantes, mais arrrrgh !!

Aidez-moi si vous le pouvez.

Merci, Todd

Répondre

2

Je pense que votre appel ne se fait pas sur EDT. Enveloppez-le avec SwingUtilities.invokeLater

+0

Cela a fonctionné - merci! – Todd

+0

BTW, ai-je besoin d'envelopper le code similaire qui est dans un ListCellRenderer? Ou est-ce une question trop vague à l'endroit où la liste peut être? – Todd

+0

Tout code ayant trait à l'interface utilisateur (même les modèles) doit être exécuté sur EDT. Vous pouvez vérifier si vous y êtes en utilisant SwingUtilities.isEventDispatchThread() –

1

Voici un motif que vous pouvez utiliser si vous avez une méthode qui modifie les composants swing ou leurs modèles et qui doit donc être appelée sur l'EDT, mais peut être appelée à partir d'un thread d'arrière-plan. Cela garantit fonctoujours fonctionne sur le EDT:

void func(final Type1 arg1, final Type2 arg2) { 

    if (!SwingUtilities.isEventDispatchThread()) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       func(arg1, arg2); 
      } 
     }); 
     return; 
    } 
    // method code goes here 
} 
+0

Devon, très gentil, merci pour le motif !! – Todd

Questions connexes