2010-01-19 6 views
5

Dans certaines circonstances, j'ai besoin d'un JTabbedPane pour rester sur un volet jusqu'à ce que l'utilisateur fournisse certaines informations. Essentiellement, lorsque cette circonstance se produit, j'ai besoin que le volet actuel devienne modal.Comment puis-je geler sur un volet d'un JTabbedPane?

Comment puis-je l'implémenter? Je pensais que je pourrais attraper n'importe quel événement est déclenché lorsque le volet change, et remis à la vitre que je veux coller. Mais je crains que cela ne soit pas tout à fait exact, que selon le moment où l'événement se déclenche, la transition vers le nouveau volet se produira après J'appelle la méthode pour placer le volet sur le volet que je veux, ou un autre condition de course similaire. Y a-t-il un meilleur moyen? Y a-t-il un moyen de faire fonctionner cette approche?

+0

Vous ne pouvez pas utiliser JDialog ou JOptionPane? – ChadNC

+0

@ChadNC, j'ai pensé à cela, et en fait je préférerais cette option, mais dans ce cas, l'utilisateur doit prendre des mesures sur ce volet pour changer les circonstances pour éliminer la condition que j'ai besoin de geler. Et il existe plusieurs façons d'atténuer cette condition, en utilisant les contrôles de ce volet. Si j'ouvre un dialogue modal, ils perdent l'accès à tous ces contrôles. – skiphoppy

Répondre

6

Je suggère de désactiver les autres onglets. Cela a pour effet positif de fournir aux utilisateurs des commentaires qu'ils ne peuvent pas cliquer sur l'onglet. Sinon, ils peuvent être en train de cliquer follement et se demander pourquoi il ne les laissera pas quitter l'onglet.

Il suffit de les activer à nouveau une fois les champs obligatoires terminés.

+1

Faites également très clair à l'utilisateur ce qu'ils doivent réparer. Je ne peux pas penser à beaucoup de choses plus frustrantes que d'être coincé sur un modal tout ce qui attend une entrée, je ne sais pas comment entrer. – TwentyMiles

+0

@TwentyMiles Yup, je souligne habituellement le champ rouge ou jaune .. le faire ressortir. –

+0

Ceci est ma réponse acceptée, mais j'ai utilisé des morceaux de tous les autres; ChadNC m'a aidé à comprendre la méthode setEnabledAt() (que je n'arrivais pas à trouver par moi-même, même si je lisais assez bien JavaDocs), et la solution de Carlos a presque fonctionné pour moi et fait une bonne solution solution pour faire fonctionner le concept de base. – skiphoppy

2

simplement désactiver le JTabbedPane:

pane.setEnabled(false); 

et l'activer si tous les champs sont correctement réglés (ou quel que soit l'état)

+0

Assez cool! Légèrement éteint parce qu'il grise l'onglet actuel, mais le volet actuel reste actif, donc cela fonctionne. Je pense que je vais essayer de désactiver chaque onglet individuel, si je peux le résoudre correctement. – skiphoppy

+1

@skiphoppy - Si vous ne voulez pas griser l'onglet actuel, vous pouvez utiliser les solutions @Chris: utilisez 'JTabbedPane.setEnablebAt (int, boolean) 'pour désactiver chaque onglet sauf le courant. –

2

Vous pouvez utiliser un CardLayout avec JPanels pour faire ce que vous voulez et ne pas utiliser JTabbedPanes. Puisque vous devez utiliser les volets à onglets, je suggérerais qu'une fois que la condition a été atteinte que vous vouliez forcer l'utilisateur à rester sur cet onglet, définissez cet onglet pour qu'il soit sélectionné.

setTabComponentAt(int index, Component component) 

ou

setSelectedIndex(int index) 

Définir un indicateur indiquant que l'utilisateur ne doit pas être en mesure de procéder avant de terminer tout ce que vous voulez faire et que tous les autres onglets sont désactivés à l'aide setEnabledAt(int index, boolean enabled) . Une fois que l'utilisateur a terminé ce dont il avait besoin pour continuer à définir le drapeau en conséquence et réactiver les autres onglets.

Je n'ai pas le temps d'essayer cette solution, mais je pense que cela devrait fonctionner.

Questions connexes