Afficher un texte par dessus tout

Fermé
Nico - 9 mars 2013 à 15:51
 Loks - 1 juil. 2013 à 13:38
Bonjour,

Je viens sur ce forum car je coince sur un gros problème.. Je vous explique le contexte :

J'ai créé une frame qui contient deux panels (dans un borderLayout). Celui ci est une fenetre d'un jeu.

J'aimerai pouvoir afficher un texte par dessus tout pour dire "Joueur 1(ou2) joue" ..

Je ne veux pas crée une autre fenetre (car c'est plus moche), ni bouger l'interface de derrière. Ca serait un texte qui s'affiche par dessus le reste momentanément.

Mon problème vient du fait que je ne sais pas quel Classe utilisé pour instancier un tel objet.


Merci pour toutes vos réponses et/ou pistes à suivre.

5 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
10 mars 2013 à 10:35
Une idée : tu peux remplacer le contenu de ta JFrame le temps d'afficher ton texte avant d'afficher à nouveau le contenu initial.

Par exemple avec une méthode comme ceci :

/**
 * Remplace temporairement le contenu d'une frame par un contenu provisoire.
 * @param frame la frame où l'on doit afficher le contenu provisoire
 * @param temp le contenu provisoire
 * @param millis la durée d'affichage du contenu provisoire
 * @return le contenu temporairement masqué
 */
public static Container replace(final JFrame frame, final Container temp, final long millis)
{
    // Sauvegarde du panel courant
    final Container pane = frame.getContentPane();
    
    // Dimpensionnement à l'identique du panel remplacant
    temp.setSize(pane.getSize());
    
    // Remplacement du panel
    frame.setContentPane(temp);
    frame.repaint();
    
    // Création d'un délai avant de remettre en place le contenu
    new Thread()
    {
        public void run()
        {
            // Attente
            try {Thread.sleep(millis); } catch (InterruptedException e) {}
            
            // Remise en place du panel initial
            frame.setContentPane(pane);
            frame.repaint();
        }
    }.start();
    
    return pane;
}

Et voici un petit exemple de comment s'en servir :

public static void main(String[] args)
{
    final JFrame frame = new JFrame("HelloWorld");    
    frame.setLayout(new GridLayout(3,1));
    
    frame.add(new JLabel("Quel est votre nom ?"));
    
    final JTextField name = new JTextField(System.getProperty("user.name"));
    frame.add(name);
    
    final JButton hello = new JButton("Bonjour");
    frame.add(hello);
    
    hello.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            // Création du contenu provisoire à afficher
            final JPanel temp = new JPanel();
            temp.add(new JLabel("Bonjour "+name.getText()));
            
            replace(frame,temp,2000);
        }            
    });
    
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
1
nico147 Messages postés 1 Date d'inscription dimanche 10 mars 2013 Statut Membre Dernière intervention 10 mars 2013
10 mars 2013 à 22:51
Bonjour,

Tout d'abord merci de ta réponse, je garde ton plan B au chaud qui reste une solution viable!

Cependant, une telle technique fait momentanément disparaître le contenu initial le temps d'afficher autre chose..
Ce que j'essaye de faire c'est d'écrire un texte par dessus le contenu de la Frame.

Quelqu'un a t il une solution pour remédier à cet inconvénient?

En vous remerciant d'avance,
Nico.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
11 mars 2013 à 07:05
Avec ce que tu veux faire, le problème c'est qu'il va falloir ajouter un composant à la JFrame, or celle-ci peut être soumise à des contraintes de Layout.
Avec mon code d'exemple on pourrait essayer de faire :

public void actionPerformed(ActionEvent e)
{
    // Création du contenu provisoire à afficher
    final JPanel temp = new JPanel();
    temp.add(new JLabel("Bonjour "+name.getText()));
    
    frame.add(temp);
    frame.repaint();
    
    //replace(frame,temp,2000);
}

Mais ça devient tout de suite n'importe quoi, dans un premier temps ça n'affiche rien, et ensuite si on redimensionne la fenêtre cela modifie complètement l'organisation des composants...

Alors bien sûr, on pourrait faire des fenêtres pop-up qui se mettent en plein milieu, mais j'ai cru comprendre que tu n'en voulais pas :
"Je ne veux pas crée une autre fenetre (car c'est plus moche)"
0
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
Modifié par Lapourax le 19/03/2013 à 13:33
y'a une classe qui permet de faire une fenetre qui prend le focus,
JInternalFrame

Si je me souviens bien avec sa tu peu faire une petite fenêtre genre sans cadre qui affiche ton texte
Dans le contructeur tu met un timer, au bout de x secondes elle se ferme et c'est pas plus moche que sa...
Apres c'est sur c'est moins bien que le texte en surbrillance sur la première page
Si tu veu garder absolument cette idée je crois que c'est du coté des layout qu'il faut creuser... Mais je sais par expérience que les trucs qui se superposent Java il aime pas sa si c'est pas aligné niquel
le risque c'est que sa t'affiche rien et que sa fasse planter tout ton existant
Mais c'est surement possible =)
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
19 mars 2013 à 18:26
Dans ce genre d'idées il y a surtout les JOptionPane qui permettent de faire apparaître une petite pop-up sans avoir à construire soit même le JInternalFrame, mais je pense que ça fait partie des trucs "moche" dont ne veux pas nico147...
0
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
20 mars 2013 à 09:07
Ah ou sinon ya JDialog aussi que j'avai oublié
C'est une fenêtre que tu peu configurer facile qui prend le focus...
A voir =)
0

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

Posez votre question
bonjour,
Je sais pas si ça va encore servir mais au cas où...
Le glassPane en java permet de faire ce que vous voulez, suffit juste de jouer avec la transparence des objets dessus (JPanel, JLabel...)
0