Afficher des traits sur JLabel [Résolu]

yoanpg 124 Messages postés dimanche 15 février 2009Date d'inscription 18 mai 2017 Dernière intervention - 17 déc. 2014 à 15:41 - Dernière réponse : Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention
- 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 :)
Afficher la suite 

9 réponses

Répondre au sujet
issemgane 32 Messages postés lundi 15 décembre 2014Date d'inscription 23 décembre 2014 Dernière intervention - 18 déc. 2014 à 14:25
0
Utile
Salut,est ce que vous avez penser à donner une taille fixe pour le Jpanel. ?
Commenter la réponse de issemgane
yoanpg 124 Messages postés dimanche 15 février 2009Date d'inscription 18 mai 2017 Dernière intervention - 19 déc. 2014 à 12:21
0
Utile
2
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
issemgane 32 Messages postés lundi 15 décembre 2014Date d'inscription 23 décembre 2014 Dernière intervention - 19 déc. 2014 à 14:40
pour adapter les panel à la taille de la fenêtre vous devez utiliser les Layout.
yoanpg 124 Messages postés dimanche 15 février 2009Date d'inscription 18 mai 2017 Dernière intervention > issemgane 32 Messages postés lundi 15 décembre 2014Date d'inscription 23 décembre 2014 Dernière intervention - 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 !
Commenter la réponse de yoanpg
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 7 janv. 2015 à 10:11
0
Utile
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);
  }
}


Commenter la réponse de Twinuts
yoanpg 124 Messages postés dimanche 15 février 2009Date d'inscription 18 mai 2017 Dernière intervention - 8 janv. 2015 à 11:55
0
Utile
Merci Twinuts !
Je vais tester ça et reviens avec de bonnes nouvelles je l'espère :)
Commenter la réponse de yoanpg
yoanpg 124 Messages postés dimanche 15 février 2009Date d'inscription 18 mai 2017 Dernière intervention - 9 janv. 2015 à 11:16
0
Utile
2
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 :)
yoanpg 124 Messages postés dimanche 15 février 2009Date d'inscription 18 mai 2017 Dernière intervention - 9 janv. 2015 à 11:24
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 9 janv. 2015 à 11:38
Salut,

De rien :)
Commenter la réponse de yoanpg

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.