JTabbedPane problème focus
Résolu
Hitsaki
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour à tous,
étant étudiant en licence informatique, j'ai décidé de crée un paint pour m'entrainer, j'ai donc respecter le schéma suivant :
- Une class Fenetre (extends JFrame) , elle contient un menu (via lequel on peut crée des nouveaux panneaux ainsi que l'Objet JTabbedPane (onglets)
- A chaque fois qu'on appuie sur "nouveau" pour un nouveau panneau, un onglet est crée , cet onglet contient une instance de Panneau (extends JPannel), qui lui meme contient des boutons pour le choix de la couleur de dessins, quelques outils, ainsi qu'une zone de dessin ( Class Draw, extends JPannel, implements mouse listener).
Donc on crée une fenetre, puis quand on crée un nouveau projet, cela crée un panneau qui lui meme contient des boutons et un Draw.
Tout marche niquel sur le paint, mais :
Mon problème est le suivant, quand je lance le programme : Je crée un onglet , je peux dessiner dessus. Je recrée un onglet, la le focus passe sur le DERNIER onglet crée, MEME SI je reviens sur le premier onglet (et j'ai bien vérifier qu'il comprend bien que j'y suis) il dessine sur le Draw du DERNIER ONGLET OUVERT et cela peut importe le nombre d'onglets ouvert, j'ai donc essayer de stocké tout les panneau (onglets) dans un tableau pour ensuite donner le focus a celui sur lequel je vais me rendre (avec tabpan[onglets.getSelectedIndex()].requestFocusInWindow(); ) (j'ai aussi essayer de donner le focus a la Draw avec tabpan[onglets.getSelectedIndex()].getDraw().requestFocusInWindow();
mais sans succès. Je ne comprend pas pourquoi quoi que je fasse, meme quand je suis sur un autre onglet les points de touts les onglets s'affiche bien (si je dessine un A sur le premier, puis un B sur le deuxieme quand je switch entre les deux il m'affiche bien un coup A un coup B) mais une fois que j'ai deux onglets ou plus il dessine uniquement sur le dernier. je met ici le code de la classe Fenetre, faites moi signe si vous voulez les autres classes. Merci par avance
étant étudiant en licence informatique, j'ai décidé de crée un paint pour m'entrainer, j'ai donc respecter le schéma suivant :
- Une class Fenetre (extends JFrame) , elle contient un menu (via lequel on peut crée des nouveaux panneaux ainsi que l'Objet JTabbedPane (onglets)
- A chaque fois qu'on appuie sur "nouveau" pour un nouveau panneau, un onglet est crée , cet onglet contient une instance de Panneau (extends JPannel), qui lui meme contient des boutons pour le choix de la couleur de dessins, quelques outils, ainsi qu'une zone de dessin ( Class Draw, extends JPannel, implements mouse listener).
Donc on crée une fenetre, puis quand on crée un nouveau projet, cela crée un panneau qui lui meme contient des boutons et un Draw.
Tout marche niquel sur le paint, mais :
Mon problème est le suivant, quand je lance le programme : Je crée un onglet , je peux dessiner dessus. Je recrée un onglet, la le focus passe sur le DERNIER onglet crée, MEME SI je reviens sur le premier onglet (et j'ai bien vérifier qu'il comprend bien que j'y suis) il dessine sur le Draw du DERNIER ONGLET OUVERT et cela peut importe le nombre d'onglets ouvert, j'ai donc essayer de stocké tout les panneau (onglets) dans un tableau pour ensuite donner le focus a celui sur lequel je vais me rendre (avec tabpan[onglets.getSelectedIndex()].requestFocusInWindow(); ) (j'ai aussi essayer de donner le focus a la Draw avec tabpan[onglets.getSelectedIndex()].getDraw().requestFocusInWindow();
mais sans succès. Je ne comprend pas pourquoi quoi que je fasse, meme quand je suis sur un autre onglet les points de touts les onglets s'affiche bien (si je dessine un A sur le premier, puis un B sur le deuxieme quand je switch entre les deux il m'affiche bien un coup A un coup B) mais une fois que j'ai deux onglets ou plus il dessine uniquement sur le dernier. je met ici le code de la classe Fenetre, faites moi signe si vous voulez les autres classes. Merci par avance
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Fenetre extends JFrame {
private Panneau [] tabpan = new Panneau [2000];
JTabbedPane onglets;
//private Panneau pan; // panneau principal de l'appli
private static int compt = 0;
public Fenetre () {
this.setTitle("Paint"); // titre fenetre
this.setSize(900,700); // taille fenetre
this.setMinimumSize(new Dimension (900,700)); // taille minimum possible de la fenêtre
//this.setLocationRelativeTo(null); // positionement fenetre au centre
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // quitte processus quand on ferme fenetre
//pan = new Panneau(); // crée le panneau principal de la fenetre ou on mettera les composants
onglets = new JTabbedPane();
onglets.addChangeListener(new Change());
//JButton close = new JButton ("x");
//close.addActionListener(new Close());
//onglets.addTab("Image " + compt, null, pan,null);
JMenuBar barre = new JMenuBar ();
JMenu fichier = new JMenu ("Fichier");
JMenuItem nouveau = new JMenuItem ("Nouveau");
nouveau.addActionListener(new ActionPan());
fichier.add(nouveau);
barre.add(fichier);
this.setJMenuBar(barre);
setContentPane(onglets);
//this.setContentPane(onglets); // inclus le panneau crée dans la fenetre
this.setVisible(true); // rend la fenêtre visible
//pan.repaint(); // appel la methode paintComponent() héritée de JPanel
}
public static void main(String[] args) {
Fenetre paint = new Fenetre (); // crée la fenetre principale
}
class ActionPan implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
tabpan[compt] = new Panneau();
onglets.addTab("Image " + (compt+1), null, tabpan[compt],null);
compt++;
}
}
class Change implements ChangeListener {
public void stateChanged(ChangeEvent event){
tabpan[onglets.getSelectedIndex()].requestFocusInWindow();
//tabpan[onglets.getSelectedIndex()].getDraw().requestFocusInWindow();
}
}
// window adapter pour fermer la fenêtre quand on clique sur la croix rouge
class Fermer extends WindowAdapter {
public void windowClosing (WindowEvent evt) {
evt.getWindow().dispose();
System.exit(0);
}
}
}
A voir également:
- JTabbedPane problème focus
- Helicon focus - Télécharger - Photo & Graphisme
- Focus writer - Télécharger - Traitement de texte
- Focus magic - Télécharger - Photo & Graphisme
- Firefox focus mac - Télécharger - Navigateurs
- Firefox focus - Télécharger - Navigateurs
1 réponse
Bonjour,
On n'a pas la classe Panneau pour pouvoir reproduire ton problème.
Est-ce que tu pourrais nous fournir un code complet pour tester ?
PS. Panneau[2000] c'est violent, tu penses vraiment utiliser 2000 onglets en même temps ? Ici il te faudrait plutôt une liste qu'un tableau, ça te permettra d'avoir autant d'onglets que tu veux même si tu ne sais pas combien tu peux en avoir au maximum.
On n'a pas la classe Panneau pour pouvoir reproduire ton problème.
Est-ce que tu pourrais nous fournir un code complet pour tester ?
PS. Panneau[2000] c'est violent, tu penses vraiment utiliser 2000 onglets en même temps ? Ici il te faudrait plutôt une liste qu'un tableau, ça te permettra d'avoir autant d'onglets que tu veux même si tu ne sais pas combien tu peux en avoir au maximum.
merci par avance !
Il aurait été plus simple de manipuler directement un BufferedImage, via sa méthode getGraphics() et de le réafficher au fur et à mesure de ses modifications.
Exemple :