IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Drawline affiche les lignes derrieres :(


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Points : 23
    Points
    23
    Par défaut Drawline affiche les lignes derrieres :(
    Bonsoir,

    Bon voilà j'ai passé 2 heures à chercher pourquoi mes lines ne s'affichaient pas alors que mon paint était bon, jusqu'à ce que j'essaye un removeAll avant d'afficher les lignes et que je vois qu'elle s'affichaient derrière.

    En gros j'ai un JPanel, sur lequel j'ai un grid layout de canvas (qui contiennent divers trucs qui s'affichent très bien), puis quand je clique d'un canvas à l'autre, ça relit les deux par un trait. Le seul truc c'est que je vois pas comment faire pour que ce trait soit dessus.
    Moi ce que j'ai fait c'est que je dessine sur le Graphics du panneau contenant le grid layout.
    J'implore votre aide ^^

    PS : Avant je faisais avec des JButton au lieu de canvas, j'ai juste modifié le code en conséquence, mais ça marchait très bien Oo.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 855
    Points
    22 855
    Billets dans le blog
    51
    Par défaut
    bon alors déjà y a ça : Comment combiner des composants AWT et Swing ?
    Donc avec un version ancienne de Java, les Canvas s'afficheront toujours par dessus le reste de ton JPanel quoi que tu fasses. Il te faudra contrôler la version de la JVM utilisée si tu veux absolument continuer à mélanger Swing et AWT.

    Et ensuite par defaut de toute manière les composant fils d'un conteneur s'affichent toujours par dessus le contenu de leur parent puisque paint() appelle les méthodes dans l'ordre suivant :

    1. paintBorder()
    2. paintComponent()
    3. paintChildren()


    donc il faut faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /**
     * {@inheritDoc}
     */
    @Override
    public paint(Graphics g) {
      super.paint(g);
      paintLineBetweenCanvas();
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    Mon projet est sous la version 1.6 du JDK, et sinon voici comment j'avais fait la méthode paint :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public void paint(Graphics g)
    	{
    		super.paint(g);
    		for (Lien l : this.lien)
    		{
    			l.dessiner(g);
    		}
    	}
     
    public void addLien(Lien l)
    {
    	if (! this.lien.contains(l))
    	{
    		this.lien.add(l);
    		repaint();
    	}
    }

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 855
    Points
    22 855
    Billets dans le blog
    51
    Par défaut
    Oui mais la supperposition de l'AWT et de Swing est SENSEE (pas testee) fonctionner correctement a partir de 1.6.0_12 (et non pas uniquement de Java 1.6)
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    Pour plus de précision j'ai la version 1.6.0_15 ^^
    Bon en fait si j'avais des canvas c'est parce que j'avais besoin de créer un contrôle graphique sur lequel je puisse dessiner certains éléments et du texte. En fait j'avais utilisé les JButton au début pour mes tests (mon composant extends JButton) mais du coup c'était pas très adapté (c'était pour tester mes algo). J'avais lu que le canvas était ce qu'il fallait, cependant je peux toujours changer de composant graphique, ça sera plutôt rapide.
    Quel composants du même style que le canvas je peux utiliser ? JPanel peut être ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    Bon après quelques recherches j'ai lu :
    - JPanel de swing a pour but de remplacer Canvas de AWT
    - Dans JPanel on n'a qu'a surcharger uniquement paintComponent, alors qu'en AWT on pas le choix entre toutes ces méthodes, c'est juste paint
    - Certains gars ont fait des JCanvas extends JPanel... mais peu d'intérêt
    - On peut utiliser Canvas avec swing, il est supporté par celui ci, mais à utiliser que vraiment si c'est necessaire

    Bon merci pour tes renseignements, je ferai ça demain matin. Je met le post en Résolu car ça devrait être le cas sinon je reviendrais poster

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 855
    Points
    22 855
    Billets dans le blog
    51
    Par défaut
    Ok qq tests avec le JRE 1.60_19....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
    package swingawt;
     
    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Panel;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
     
    /**
     *
     * @author Fabrice Bouyé (fabriceb@spc.int)
     */
    public class Main extends JPanel {
     
        public enum Variant {
     
            SWING,
            AWT;
        }
     
        public Main(Variant variant) {
            setLayout(null);
            switch (variant) {
                case AWT: {
                    for (int j = 0; j < 20; j++) {
                        JPanel jPanel1 = new JPanel();
                        jPanel1.setBounds(30, j * 40, 100, 20);
                        jPanel1.setBackground(Color.GREEN);
                        add(jPanel1);
                    }
                    Panel canvas1 = new Panel();
                    Canvas canvas2 = new Canvas();
                    canvas1.setBounds(20, 20, 40, 500);
                    canvas2.setBounds(90, 20, 40, 500);
                    canvas1.setBackground(Color.BLUE);
                    canvas2.setBackground(Color.RED);
                    add(canvas1);
                    add(canvas2);
                    for (int j = 0; j < 20; j++) {
                        JPanel jPanel1 = new JPanel();
                        jPanel1.setBounds(30, 20+j * 40, 100, 20);
                        jPanel1.setBackground(Color.PINK);
                        add(jPanel1);
                    }
                    canvas1.setLayout(null);
                    JPanel jPanel2 = new JPanel();
                    jPanel2.setBounds(10, 10, 10, 10);
                    jPanel2.setBackground(Color.YELLOW);
                    canvas1.add(jPanel2);
                }
                break;
                case SWING:
                default: {
                    for (int j = 0; j < 20; j++) {
                        JPanel jPanel1 = new JPanel();
                        jPanel1.setBounds(30, j * 40, 100, 20);
                        jPanel1.setBackground(Color.GREEN);
                        add(jPanel1);
                    }
                    JPanel canvas1 = new JPanel();
                    JPanel canvas2 = new JPanel();
                    canvas1.setBounds(20, 20, 40, 500);
                    canvas2.setBounds(90, 20, 40, 500);
                    canvas1.setBackground(Color.BLUE);
                    canvas2.setBackground(Color.RED);
                    add(canvas1);
                    add(canvas2);
                    for (int j = 0; j < 20; j++) {
                        JPanel jPanel1 = new JPanel();
                        jPanel1.setBounds(30, 20+j * 40, 100, 20);
                        jPanel1.setBackground(Color.PINK);
                        add(jPanel1);
                    }
                    canvas1.setLayout(null);
                    JPanel jPanel2 = new JPanel();
                    jPanel2.setBounds(10, 10, 10, 10);
                    jPanel2.setBackground(Color.YELLOW);
                    canvas1.add(jPanel2);
                }
            }
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            Graphics2D g2d = (Graphics2D)g;
            g2d.setStroke(new BasicStroke(8f));
            g2d.setColor(new Color(0,0,0,127));
            for (int j = 0; j < 40; j++) {
                g2d.drawLine(0, j*20, 180, j*20);
            }
        }
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            System.out.printf("Java: %s", System.getProperty("java.version")).println();
            System.out.printf("AWT mixing: %s", System.getProperty("sun.awt.disableMixing")).println();
            // Ca ne change rien !!!!
            //System.setProperty("sun.awt.disableMixing", "false");
            //System.setProperty("sun.awt.disableMixing", "true");
            //System.out.printf("AWT mixing: %s", System.getProperty("sun.awt.disableMixing")).println();
            SwingUtilities.invokeLater(new Runnable() {
     
                public void run() {
                    for (Variant variant : Variant.values()) {
                        JFrame frame = new JFrame("Test");
                        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        frame.setLayout(new BorderLayout());
                        frame.add(new Main(variant), BorderLayout.CENTER);
                        JMenuBar menuBar = new JMenuBar();
                        JMenuItem variantMenu = new JMenuItem(variant.toString());
                        menuBar.add(variantMenu);
                        for (int j = 0; j < 10; j++) {
                            JMenu menu = new JMenu("Menu " + (j + 1));
                            for (int i = 0; i < 5; i++) {
                                JMenuItem menuItem = new JMenuItem("Menu item " + (i + 1));
                                menu.add(menuItem);
                            }
                            menuBar.add(menu);
                        }
                        frame.setJMenuBar(menuBar);
                        frame.setSize(600, 600);
                        frame.setVisible(true);
                    }
                }
            });
        }
    }
    C'est leur superposition qui ne fonctionne pas bien....

    Si on voit bien le JPanel jaune (j'ai remplace le Canvas par un Panel puisqu'on ne peut pas ajouter de composants dans un Canvas). Ce n'est pas ca pour le les ligne qui est dessinee pardessus.... Elles ne se dessinent que pardessus les autres composants Swing... EDIT - les composants Swing non-inclus dans des composants AWT car les lignes ne se dessinent pas sur le JPanel jaune quand celui-ci est dans un Panel.

    Nom : AWTSwing Wooes.jpg
Affichages : 169
Taille : 95,9 Ko

    Note : ici je dessine les lignes avec une couleur transparente pour mettre en evidence qu'elles ne se dessinent que pardessus les composants Swing mais le resultat est similaire avec un couleur opaque.

    Ce que je te conseille en attendant c'est de remplacer tous tes Canvas par des JComponent, ca ne devrait rien changer a ton programme sauf si tu as absolument besoin d'afficher des composants AWT.

    Je vais notifier la personne qui devait faire un article sur ca et je vais reflechir a un correctif pour la FAQ.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    Pt1 c'est nickel j'ai juste changé Canvas par JPanel, paf je compile et c'est bon ça marche et mes traits se dessinent.
    Je viens de tester avec JComponent, c'est encore mieux, et comme j'avais déjà recodé les méthodes setText et setBorder(elle est dans JPanel celle là) qui ne sont pas dans JComponent (et qui n'étaient pas dans Canvas) ben je garde JComponent.

    Merki, je vais pouvoir avancer sur mon projet (ça faisait deux jours que j'enchaînait les pb d'interface graphique, et celui là c'était le dernier).

    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher les lignes désirées avec la commande awk
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 16/06/2007, 20h58
  2. ne pas afficher les lignes Vides
    Par k-eisti dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/05/2007, 18h02
  3. Réponses: 2
    Dernier message: 13/12/2006, 20h30
  4. [debutant]afficher les lignes?
    Par loveflower dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 26/11/2005, 14h43
  5. Afficher les lignes d'un fichier
    Par pepere73 dans le forum C++
    Réponses: 16
    Dernier message: 21/02/2005, 22h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo