Afficher un texte par dessus tout

Nico -  
 Loks -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention  
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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 3014 Date d'inscription   Statut Contributeur Dernière intervention   334
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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 3014 Date d'inscription   Statut Contributeur Dernière intervention   334
 
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
Loks
 
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