Afficher des traits sur JLabel

Résolu
yoanpg Messages postés 156 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 janvier 2024 - 17 déc. 2014 à 15:41
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 9 janv. 2015 à 11:38
Bonjour à tous,

J'ai un JPanel :
JPanel panel = new JPanel(){
public void paint(Graphics g){
super.paint(g);
dessinerCadrillage(g);
}
};


Dans la méthode dessinerCadrillage(g), je dessine un cadrillage (normal vu le nom !) en faisant des traits horizontaux, et je replace des JLabel (qui sont créés dans la méthode présentée juste après) :
private void dessinerCadrillage(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setColor(new Color(0, 0, 0, 50));
for (int i=0;i<10;i++) g2.draw(new Line2D.Double(30,i*100,70,i*100));
for (int i=0;i<7;i++) label[i].setBounds(0,i*100-10,70,30);
}


Enfin, j'ai une méthode (lancée au moment de la création de ma fenêtre) qui ajoute plusieurs JLabel dans mon JPanel :
private void ajouterLabels() {
for (int i=0; i<7; i++) {
label[i]=new JLabel("label"+i);
label[i].setOpaque(true);
label[i].setBackground(Color.white);
panel.add(label[i]);
}
panel.repaint();
}


Mon problème est que, à l'affichage de la fenêtre, les JLabel sont par-dessus les traits, donc les traits ne sont pas visibles. Et ajouter un panel.repaint() qui recrée le cadrillage ne permet pas de résoudre ce problème !
Par contre, dès que je redimentionne ma fenêtre, les traits passent alors par-dessus les JLabel et apparaissent !

Comment faire pour que les traits soient toujours par-dessus les JLabel ?
Merci d'avance de votre aide :)

5 réponses

issemgane Messages postés 32 Date d'inscription lundi 15 décembre 2014 Statut Membre Dernière intervention 23 décembre 2014
18 déc. 2014 à 14:25
Salut,est ce que vous avez penser à donner une taille fixe pour le Jpanel. ?
0
yoanpg Messages postés 156 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 janvier 2024 3
19 déc. 2014 à 12:21
Ca ne change rien, même comportement.

Et puis ce n'est pas ce que je veux, je veux que mes panels s'adaptent à la taille de la fenêtre.

Merci
0
issemgane Messages postés 32 Date d'inscription lundi 15 décembre 2014 Statut Membre Dernière intervention 23 décembre 2014
19 déc. 2014 à 14:40
pour adapter les panel à la taille de la fenêtre vous devez utiliser les Layout.
0
yoanpg Messages postés 156 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 janvier 2024 3 > issemgane Messages postés 32 Date d'inscription lundi 15 décembre 2014 Statut Membre Dernière intervention 23 décembre 2014
19 déc. 2014 à 14:57
C'est ce que j'ai fait. Mon JPanel est à l'intérieur d'un autre JPanel qui utilise le GridBagConstraint.

Mais encore une fois, ce n'est pas le problème. J'ai volontairement définit un layout null pour mon panel, pour pouvoir y placer les éléments à ma guise dedans. Sauf que les JLabels passent par dessus les traits !
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
7 janv. 2015 à 10:11
Salut,

Je ne sais pas exactement ce que tu veux faire mais:
- En swing on ne dessine pas dans la méthode paint mais paintComponent.
- Si tu veux bouger tes composants manuellement il faut invalider le LayoutManager de ton JPanel (il en place un en FlowLayout par defaut)
- Bouger un composant dans la méthode paint est plus que douteux.
- Si tu veux avoir une grille qui sera *toujours* au dessus des composants de ta fenêtre tu peux t'aider des GlassPane sinon il faudra que tu joues avec le Z order qui défini quel composant doit être dessiné avant l'autre.

Pour te faire une idée de l'empilement des couches au niveau d'une JFrame:

Et pour plus d'infos: http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html


Voici un petit exemple qui replace les labels et qui utilise un glasspane

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Test extends JFrame {
  private JLabel labels [] = new JLabel[7];
  public Test() {
    JPanel content = new JPanel();
    content.setLayout(null);
    createLabels(content); // ajout des labels
    moveLabels(content); // place les labels
    setContentPane(content);
    
    setGlassPane(new GlassPane());
    getGlassPane().setVisible(true);
    

    setSize(800, 600);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
  }
  
  private void createLabels(JPanel panel) {
    for (int i = 0; i < labels.length; i++) {
      labels[i] = new JLabel("label" + i);
      labels[i].setOpaque(true);
      labels[i].setBackground(Color.white);
      panel.add(labels[i]);
    }
  }
  
  private void moveLabels(JPanel panel) {
    /* 
     * dans l'exemple le panel ne contient pas d'autres composants que des labels
     * du coup pas besoin de passer la références du tableau de labels,
     * il suffit juste de lister les composants attachés au panel. 
     */
    for(int i = 0; i < panel.getComponentCount(); i++)
      panel.getComponent(i).setBounds(0, i*100-10, 70, 30);
  }
  
  
  private class GlassPane extends JPanel {
    private BufferedImage grid = null;
    
    public GlassPane() {
      setOpaque(false);
    }
    
    public void paintComponent(Graphics g) {
      super.paintComponent(g);
      /* comme tu n'utilises pas la taille de la fenêtre pas besoin de *toujours* redessiner les lignes */
      if(grid == null) {
        int max = 10;
        grid = new BufferedImage(80, max * 100, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = grid.createGraphics();
        g2.setColor(new Color(0, 0, 0, 50));
        for (int i = 0; i < max; i++) g2.draw(new Line2D.Double(30, i*100, 70, i*100));
      }
      /* dessine l'image */
      g.drawImage(grid, 0, 0, this);
    }
  }
  
  public static void main(String[] args) {
    new Test().setVisible(true);
  }
}


0
yoanpg Messages postés 156 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 janvier 2024 3
8 janv. 2015 à 11:55
Merci Twinuts !
Je vais tester ça et reviens avec de bonnes nouvelles je l'espère :)
0

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

Posez votre question
yoanpg Messages postés 156 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 janvier 2024 3
9 janv. 2015 à 11:16
Bon ça marche pas mal :)

Par contre, ça entraine autre chose : j'avais définit des curseurs à différents endroits de ma fenêtre (sur des JPanel, JLabel ...).
Avec le GlassPanel ajouté au dessus, ces curseurs ne sont plus affichés.

C'est possible que le GlassPanel soit "transparent" aux curseurs ?

Merci :)
0
yoanpg Messages postés 156 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 janvier 2024 3
9 janv. 2015 à 11:24
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
9 janv. 2015 à 11:38
Salut,

De rien :)
0
Rejoignez-nous