Naviguer entre les onglets en java

Résolu/Fermé
BenBanana - 10 nov. 2009 à 12:04
 evolution - 15 déc. 2010 à 13:31
Bonjour,

e crée un petit éditeur de texte pour m'entraîner en java et je rencontre un problème concernant la gestion des onglets.

Je sais créer de nouveaux onglets, je sais ouvrir un fichier qui s'affichera dans le premier onglet que j'ai créé mais je ne sais pas ouvrir un fichier dans le n-ème onglet.

Pour celà il faudrait que je sois capable dans ma fonction ouvrir d'identifier le JTextArea qui est compris dans l'onget actuellement ouvert.

Je suppose qu'il y a tout comme en C++ une méthode en java qui permet de connaître l'onglet actuellement ouvert et surtout d'accèder au JTextArea qu'il contient.

J'ai cherché mais je n'ai pas trouvé.

Merci de votre aide. :-)
A voir également:

12 réponses

sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
11 nov. 2009 à 22:07
Voici notre tit exemple:

package fonctions;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;

public class BenBanana extends JFrame {
	private static final long serialVersionUID = 1L;

	class MyJTextPane extends JPanel {
		private static final long serialVersionUID = 1L;
		JTextArea ta;

		public MyJTextPane() {
			setLayout(new BorderLayout());
			ta = new JTextArea();
			add(ta, BorderLayout.CENTER);
		}

		public JTextArea getTextArea() {
			return ta;
		}
	}

	public static void main(String[] args) {
		final BenBanana mf = new BenBanana();
		mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mf.setBounds(20, 20, 500, 500);

		mf.setLayout(new BorderLayout());
		final JTabbedPane tabbedPane = new JTabbedPane();
		JPanel p1 = mf.new MyJTextPane();
		JPanel p2 = mf.new MyJTextPane();
		tabbedPane.add("First pane", p1);
		tabbedPane.add("Second one", p2);
		mf.add(tabbedPane, BorderLayout.CENTER);

		JPanel southPane = new JPanel();
		JButton infoBtn = new JButton("Get info");
		infoBtn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// afficher le contenu du JTextArea actif (1 ou 2)
				BenBanana.MyJTextPane selectedTab = ((BenBanana.MyJTextPane) tabbedPane
						.getSelectedComponent());
				JOptionPane.showMessageDialog(mf, "Current active JTA reads:\n"
						+ selectedTab.getTextArea().getText());
			}
		});
		southPane.add(infoBtn);
		mf.add(southPane, BorderLayout.SOUTH);

		mf.setVisible(true);
	}
}

Enjoy et n'hésite pas de poser des questions au cas où. Ah, concernant ton

Mais cela me forcerait à les stocker dans un tableau, et donc dans une structure de taille fini, ce qui rendrait mon programme (encore) moins flexible.

==> pas obligé d'utiliser un tableau (taille fixe). Tu peux utiliser très bien un List (qui fonctionne de la même manière qu'un vector du STL)

++
2
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
10 nov. 2009 à 13:38
0
Salut,

Je suis allé voir ton lien. Ca m'a un peu fait avancer mais je n'arrive toujours pas à résoudre mon problème.

Je n'arrive toujours pas à charger un fichier ouvert par l'utilisateur dans un nouvel onglet.

J'aimerai fait un truc du genre.

onglets.monongletsactuellementouvert.letextededans("Le texte contenu dans le fichier que j'essaie d'ouvrir")

EN tout cas merci pour ton aide.
0
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
10 nov. 2009 à 17:51
tu dois avoir un problème au niveau de tes "listener"
sans code, pas facile de te guider
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
10 nov. 2009 à 18:11
Salut,

Tu as un JTabbedPane sur lequel tu disposes tes onglets avec addTab(), right ? Activer un des onglets c'est simple: appelle tonTabbedPane.setSelectedIndex(index). Accéder à un de tes onglets est tout aussi simple: tonTabbedPane.getSelectedIndex() pour accéder au tab actif ou encore tonTabbedPane.getTabComponentAt(index) pour accéder à l'onglet #index.

++
0
Voici quelques fragments du code qui devrait vous permettre de voir ce qui ne va pas dans mon programme :


// Déclaration de ma table d'onglets
private JTabbedPane onglets = new JTabbedPane(); 

// Nouveau correspond à un JMenuItem
nouveau.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {

				onglets.add("Onglet", new JTextArea());
				
			}
});



Et donc dans j'essaie à l'aide d'un listener, de charger dans l'onglet courant un fichier stocké sur l'ordinateur.

class actionOuvrir implements ActionListener
	{

		public void actionPerformed(ActionEvent e) {
			
			JFileChooser fileChoose = new JFileChooser();
			fileChoose.setCurrentDirectory(new File("~"));;
			String fichier = null;
			
			int resultatOuvrir = fileChoose.showDialog(fileChoose, new String("Ouvrir"));
			
			if (resultatOuvrir == JFileChooser.APPROVE_OPTION) {
				
				fichier = fileChoose.getSelectedFile().toString();
				
				FileInputStream fis;
				try {
					
					fis = new FileInputStream(fichier);
					 int n;
					   
					   while ((n = fis.available())> 0) {
						   
						   byte[] b = new byte[n];
						   int result = fis.read(b);
					      if (result == -1) break;
					      String s = new String(b);
                                             // Ici la ligne manquante pour  insérer la chaine s dans mon onglet
					      
					   }
					   
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (IOException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
			}
		}
	}


J'ai essayé d'utiliser onglets.getSelectedIndex() mais celà ne semble pas me laisser la possibilité de modifier le JTextArea (pas d'appel possible de la méthode setText().

En tout cas merci pour votre réactivité.
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
10 nov. 2009 à 19:36
Pas le temps de regarder ton code maintenant, car je dois m'en aller, mais si tu vx accéder à un JTextArea, pourquoi as-tu besoin d'accéder à un tab ?

Tu gardes (par exemple) une liste de JTexteArea (correspondant à ta liste de fichiers ouverts) et tu accèdes à un de ces éléments.

Sinon, si ton JTextArea est vraiment lié à ton onglet: tu crées ta propre classe XXX (qui hérite de ce que tu veux comme composant), tu la construis (graphiquement, si tu veux), tu places un JTextArea dessus et surtout tu la dotes d'un public getMyTextArea() qui te retourne ta zone de saisie. Et tu places dans le JTabbedPanel des instances de ta classe et lorsque tu fais un getSelectedIndex() sur ton JTabbedPane, après un cast vers ta classe maison, tu pourras récupérer la zone de saisie avec ta méthode getMyTextArea...

Bon, têtre expliqué un peu rapdement, mais il faut que je m'en aille. Vais regarder ton code plus tard.

++
0
J'accède à un tab parce que c'est ce qui me parait être le plus naturel. Je me trompe peut-être.

Je pourrai lister les textArea indépendamment des onglets qui les contiennent, c'est vrai.
Mais cela me forcerait à les stocker dans un tableau, et donc dans une structure de taille fini, ce qui rendrait mon programme (encore) moins flexible.

Après peut-être qu'il y a une autre manière de faire qu'en passant par des tableaux mais elle ne m'a pas sauté aux yeux. Dans tous les cas j'aimerai ne pas trop m'écarter de mon idée de départ de lier les tab aux textArea afin de comprendre mes erreurs (sauf si cela s'avère i:mpossible bien évidemment).

En ce qui concerne la solution que tu proposes, je ne suis pas sur de l'avoir bien comprise mais j'ai essayé de la mettre en oeuvre sans succès.

Mon programme bute toujours au même niveau. De plus le cast que tu me suggères de faire apparait comme une erreur.

Voilà en résumé ce que j'avais fait, mais je le répète je ne suis pas sur d'avoir bien compris. ;-)
Quand j'y pense je ne vois pas pourquoi ça fonctionnerait mieux.

-Création d'une classe AIreDeTexte qui hérite de Component possédant juste un attribut de type JTextArea et une méthode d'accès getMyTextArea (qui se contente de renvoyer le JTextArea)
-L'ajout de nouveaux onglets se fait de cette manière : onglets.add("Onglet", new AireDeTexte());
-Le remplissage du textArea se fait : ((AireDeTexte)(onglets.getSelectedIndex())).getMyTextArea().setText("Mon texte"); // L'erreur porte sur le Cast, j'a essayé en trifouillant les paranthèses mais ça ne change rien.

Je vous demande de faire preuve d'indulgence car je n'ai pas une très longue expérience en Java. :-)
0
BenBanana Messages postés 4 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 3 mai 2011
11 nov. 2009 à 12:42
Personne pour m'aider aujourd'hui ?
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
11 nov. 2009 à 21:57
Bonsoir Ben,

Le remplissage du textArea se fait : ((AireDeTexte)(onglets.getSelectedIndex())).getMyTextArea().setText("Mon texte"); // L'erreur porte sur le Cast, j'a essayé en trifouillant les paranthèses mais ça ne change rien.


C'est normal d'avoir une erreur: getSelectedIndex() te retourne un entier (l'index de l'onglet actif), impossible de le caster vers un objet graphique. getSelectedComponent(), par contre, ferait bien l'affaire.

Je te fais un tit exemple.

++
0
BenBanana Messages postés 4 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 3 mai 2011
12 nov. 2009 à 13:26
Yeah ça marche nickel.
J'ai enfin les fichiers qui s'ouvrent dans les bons onglets.

Merci pour le temps passé, les explications et le programme. Je commençais à désespérer.
Je n'ai plus de questions la dessus pour le moment, ton programme est assez clair.

En ce qui concerne le List je ne connaissais pas. Je vais regarder ça de plus près.

A bientôt pour mon prochain problème en Java . ;-)
0
Bonjour, j'ai actuellement le même soucis que toi et je n'arrive pas à y remédier.

j'utilise ((JTextArea)(mesOnglets.getSelectedComponent())).setText(s); pour insérer mon fichier mais en vain.

mesOnglets etant mon JTabbedpane.

et je n'arrive pas à insérer la fonction getMyTextArea().
0
J'ai réussi à m'en sortir mais maintenant il me manque la fonction pour pouvoir fermer un onglet
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
12 nov. 2009 à 13:41
=) Super.

Tu travailles avec un IDE ? Avec des bouquins ? Avec un but bien précis ?
0