JTABBEDPANE AVEC CROIX DE FERMETURE ET LOOK A LA SWT (EN SWING)

desastreux Messages postés 50 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 5 août 2009 - 31 juil. 2005 à 17:16
sisisousou Messages postés 43 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 24 janvier 2012 - 16 févr. 2011 à 18:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31761-jtabbedpane-avec-croix-de-fermeture-et-look-a-la-swt-en-swing

sisisousou Messages postés 43 Date d'inscription samedi 5 janvier 2008 Statut Membre Dernière intervention 24 janvier 2012
16 févr. 2011 à 18:51
beau travaille !!!
mais un petit problème si en utilise un LAF Quaqua ^par exemple il y'a une grave erreur lors de mouse entred et mouse exited en+ le croit apparaît en dehors de la tabbedpane !!! une solution ?
guigui37600 Messages postés 11 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 26 mars 2008
27 févr. 2007 à 03:33
nikel comme classe !! dommage qu'il y a pas une mise à jours avec les remarques de desastreux ....
Merci toutes fois ca ma bien aidé pour faire la mienne
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 2
7 oct. 2006 à 15:22
mignon :-) ... ca donne tout de suite du look aux onglets :-)
badger71 Messages postés 17 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 17 janvier 2006
17 janv. 2006 à 09:52
Bonjour,

J'ai regardé de près ta source, m'en suis servi sans problème, ai même pu la modifier pour voir son comportement, tout va bien.

Mais, car il y en a un :p, pourquoi réinventer la roue ?
En effet, le "L&F" d'Eclipse étant ecrit en SWT, pourquoi utiliser SWING ?
Je ne vois qu'un seul argument, le manque de portabilité de SWT (un fichier jar par système d'exploitation est nécessaire). Sinon, tu te complique la vie pour rien :p

Pour résumer, bonne source, mais utilité peu convainquante pour moi :)

Continue a coder quand meme hein ^_^
bullgr82 Messages postés 9 Date d'inscription jeudi 20 octobre 2005 Statut Membre Dernière intervention 6 décembre 2005
6 déc. 2005 à 16:03
Salut,

tout d'abord merci pour ton code.

Ensuite, j'ai un petit souci avec tes onglets.

Lorsque je mets le titre de l'onglet à jour avec un titre plus long, la croix ne se décalle pas et apparaît donc en plein milieu du texte.
Comment puis-je régler ce petit détail ?
cs_alain57 Messages postés 5 Date d'inscription jeudi 9 septembre 2004 Statut Membre Dernière intervention 26 avril 2006
13 oct. 2005 à 14:45
je suis preneur aussi
c'est deja un tres bon début, mais comme tu le souligne ya des ptites erreurs et c'est incomplet
Mais ca a le merite d'etre clair et bien fait :)
desastreux Messages postés 50 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 5 août 2009
31 juil. 2005 à 17:16
Bonjour Mep, salut à tous !

J'ai récupéré tes sources pour les accomoder à un projet personnel de freeware opensource et je te remercie pour ta gentillesse de les avoir mises à notre dispositions : J'ai en effet ainsi enfin bien pu comprendre comment faire l'implémentation d'un Look & Feel.

Trois petits bémols cependant :

***********************************************************************************************

1_ Une série interminable d'exceptions se produit si l'on essaye de supprimer TOUS les onglets d'un même MTabbedPane et le dernier onglet n'est alors bien sûr pas supprimé.
Cela dit, ce n'est rien du tout puisqu'il suffit pour corriger cela de rajouter :

if ( selectedIndex < 0 ) return;

... Au tout début des procédures de la class ThemeUI, intitulées : "void paintContentBorder" et "void paintContentBorderTopEdge".

**********************************************************************************************

2_ En revanche, je n'arrive pas à régler le problème suivant qui revêt une grande importance pour moi : J'ai fait en sorte que la couleur de fond d'un onglet non-selectionné soit celle du texte de l'onglet sélectionné et vice-versa... ( Par exemple : Fond bleu/Texte vert pour la séléction, et Fond Vert/Texte Bleu pour les onglets non séléctionnés. )
J'ai donc du rajouté quelques lignes dans la class ecouteurDeMouse pour que les changements prennent effets à chaque clic de séléction, puisque le code est prévu à l'origine pour que seule la couleur de fond de l'onglet change :

for (int i = 0; i < getTabCount(); i++)
{
if ( i != tabNumber) { setForegroundAt(i, selectedColor); }
else { setForegroundAt(i, noneSelectedColor); }
}
//( Il faut rajouter pour cela à la CLass MTabbedPane la propriété "noneSelectedColor" et //l'instancier de la même manière que celle déjà existante : "selectedColor" )
Le problème, c'est que si ça marche pour un clic, ça ne marche pas du tout lors de la suppression d'un onglet. En effet, selon l'emplacement de l'onglet présélectionné et celui de l'onglet que l'on vient de fermer ( Emplacements qui peuvent être différent puisque la fermeture d'un onglet n'exige pas sa présélection ) l'index de séléction d'onglet change de façon indésirable ! ( Par exemple: Dès le départ de l'éxécution du programme, la fermeture du premier onglet -Index Zéro présélectionné par défaut- va entrainer la séléction de l'ancien Index n°2 devenu l'Index n°1; étrange ? En faisant quelques essais, je me suis aperçu que pour ainsi dire toutes les fermetures d'onglets donnaient un résultat différent, mais presque toujours indésirable ! Comment cela se fait-il !? Je n'en sais rien...
Le pire est que malgré l'utilisation de la fonction setSelectedIndex(), placée juste après le remove() ( Ou removeTabAt() mais cela ne semble rien changer... ) je n'arrive à rien !

Voici exactement ce que j'ai fait jusqu'à maintenant pour essayer d'endiguer le problème, mais cela ne résouds que la moitié des mauvaises post-séléctions, et est de toute façon trop indigeste pour que je continue dans cette voix :

if (listenerList.getListenerCount() == 0)
{//Fermeture d'un onglet: Adaptation des couleurs back/fore des onglets restants
int newSelIndx = getSelectedIndex(); // index du nouvel onglet à séléctionner
if ( getSelectedIndex() == tabNumber )
{ // Si la séléction en cours est justement l'onglet qu'on efface :
if (getTabCount() > 1)
{ // Dans le cas où il y a plus d'un seul onglet :
if ( tabNumber 0 ) { newSelIndx -1; } // -1 marche, mais pourquoi ?
else if ( tabNumber getTabCount()-1 ) { newSelIndx getTabCount()-2; }
else { newSelIndx = tabNumber; }
}
}
else if ( tabNumber < getSelectedIndex() )
{ // Les lignes ci-dessous ne résolvent pas tous les cas (???)
if ( tabNumber 0 ) { newSelIndx -1; }
else if ( tabNumber getTabCount()-1 ) { newSelIndx getTabCount()-2; }
else { newSelIndx = getSelectedIndex()-1; }
}
else
{// ICI : GROS PROBLEMES !!! Rien ne marche...
newSelIndx = getSelectedIndex();
}

removeTabAt(tabNumber); // Ici, on efface l'onglet !
setSelectedIndex(newSelIndx); // Ici, on choisit le new onglet selectionné

if ( newSelIndx -1 ) newSelIndx 0;
for (int i = 0; i < getTabCount(); i++)
{
if (i != newSelIndx) { setForegroundAt(i, selectedColor); }
else { setForegroundAt(i, noneSelectedColor); }
}
}
// Vous pouvez vérifier, ça résouds une bonne partie des relocations de la séléction,
// Pour le problème des couleurs, je pense pouvoir trouver une alternative en regardant mieux // comment la bascule selectionné/non séléctionné est faite pour la couleur de fond, mais en ce // qui concerne les BUGs de séléction-post-remove,là, je suis vraiment bloqué...

**********************************************************************************************

3_ Accessoirement, j'ai remarqué, en cherchant à comprendre l'utilité de tes class "CloseTabEvent" et "CloseTabListener", dans le cadre d'une séance de débug relative au point abordé ci-dessus, que lors de la fermeture d'un onglet, elles ne semblent pas intervenir le moins du monde : De plus, si j'élimine leur appel dans la Class de l'objet principal (MTabbedPane), cela ne semble rien changer du tout lors de l'éxécution du programme...
Superflu, inachevé ou bien manque d'observation de ma part ?

**********************************************************************************************

Je vais probablement continuer à chercher un peu, mais si quelqu'un a une idée, ou si l'auteur avait une version mise-à-jour à mettre sur le site et qui corrige ces erreurs bizzaroïdes, je suis humblement preneur : Merci !
Rejoignez-nous