Que passer comme argument ???

Fermé
site12 Messages postés 288 Date d'inscription dimanche 13 février 2011 Statut Membre Dernière intervention 3 décembre 2017 - 2 sept. 2015 à 18:54
site12 Messages postés 288 Date d'inscription dimanche 13 février 2011 Statut Membre Dernière intervention 3 décembre 2017 - 4 sept. 2015 à 22:04
bonjour

Dans ma classe principale main j'ai:

fenetre Fenetre  = new fenetre();
Fenetre.dessiner(???)


et dans ma classe fenetre j'ai:


import java.awt.Graphics;
public void dessiner(Graphics g)(){
//dessin d'un cercle
}


Donc voilà, je met quoi à la place de "???" , à l'intérieur des parenthèses ?

merci par avance

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 2/09/2015 à 19:15
Bonjour,

Normalement tu dois récupérer l'objet Graphics depuis des méthodes de bas niveau comme Component.paint(Graphics g) que tu surcharges comme ça :

@Override
public void paint(Graphics g) {
    super.paint(g); // ne pas oublier !
    dessiner(g);
}

Exemple :

import java.awt.Graphics;
import javax.swing.JFrame;

public class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame() {
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                g.drawRect(50, 50, 50, 50);
            }
        };
        frame.setSize(150, 150);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
La confiance n'exclut pas le contrôle
0
site12 Messages postés 288 Date d'inscription dimanche 13 février 2011 Statut Membre Dernière intervention 3 décembre 2017 23
2 sept. 2015 à 19:28
je n'ai strictement rien compris :-(

Ce que tu me dit de mettre, dans MON cas, ça se met dans la classe principale main ou dans la classe fenetre ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > site12 Messages postés 288 Date d'inscription dimanche 13 février 2011 Statut Membre Dernière intervention 3 décembre 2017
2 sept. 2015 à 19:36
Ce n'est pas avec trois lignes de codes que je peux être sûr de où ça doit aller dans ton cas. Si Fenetre extends JFrame, tu peux mettre ça dans la classe Fenetre. Mais tu pourrais également mettre ça dans un JPanel, ou directement dans le main... peu importe.
Dans tous les cas, l'objet Graphics qu'il faut passer comme argument doit venir de la méthode paint(Graphics).

Exemple :

import java.awt.Graphics;
import javax.swing.JFrame;

public class Fenetre extends JFrame {

    public void dessiner(Graphics g) {
        g.drawRect(50, 50, 50, 50);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        dessiner(g);
    }

    public static void main(String[] args) {
        Fenetre fenetre = new Fenetre();
        fenetre.setSize(150, 150);
        fenetre.setVisible(true);
        fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
0
site12 Messages postés 288 Date d'inscription dimanche 13 février 2011 Statut Membre Dernière intervention 3 décembre 2017 23
4 sept. 2015 à 16:40
Je comprends toujours pas, alors je récapitule

Je veux appeller la méthode PaintComponent depuis la classe main, comment je fais ?????

voici mes 2 classes:


public class main {


public static void main(String[] args) {
// TODO Auto-generated method stub
fenetre Display = new fenetre();
Display.afficher();
//C'EST ICI QUE JE VEUX APPELLER LA METHODE PAINTCOMPONENT DE
//LA CLASSE FENETRE, COMMENT JE FAIS ???

}

}



import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Color;

public class fenetre {

JFrame fenetre = new JFrame();

public void afficher(){

fenetre.setTitle("Ma fenetre Java");
fenetre.setSize(800,600);
fenetre.getContentPane().setBackground(Color.darkGray);
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenetre.setVisible(true);
}

public void paintComponent(Graphics g){
g.drawRect(10, 10, 15, 50);

}


}



0
site12 Messages postés 288 Date d'inscription dimanche 13 février 2011 Statut Membre Dernière intervention 3 décembre 2017 23
4 sept. 2015 à 16:41
Je ne peux pas écrire Display.paintComponent(g) car g n'est pas défini dans le main
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
4 sept. 2015 à 17:28
N'utilises pas la méthode paintComponent(Graphics) mais plutôt paint(Graphics)
Si tu appelles la méthode repaint(), elle va appeler la méthode paint en lui passant le paramètre Graphics qui convient.

Remarque : les conventions de nommages, c'est majuscules pour les classes, minuscules pour les méthodes et les variables, pas l'inverse.

public class Main {
	public static void main(String[] args) {
		Fenetre display = new Fenetre();
		display.afficher();
		display.repaint(); // appelles paint(Graphics)
	}
}

Remarque : Mélanger le français et l'anglais "display.afficher()" ça fait bizarre...
0
site12 Messages postés 288 Date d'inscription dimanche 13 février 2011 Statut Membre Dernière intervention 3 décembre 2017 23
4 sept. 2015 à 17:34
En fait j'avais oublié le
extends JPanel
, donc maintenant
repaint()
, fonctionne.
Mais bizarrement, repaint ne dessine rien du tout
0
site12 Messages postés 288 Date d'inscription dimanche 13 février 2011 Statut Membre Dernière intervention 3 décembre 2017 23
4 sept. 2015 à 17:36
Pour info j'ai renommé
 public void paintComponent(Graphics g)
en
public void paint(Graphics g)
mais ça ne déssine rien
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 5/09/2015 à 10:56
Ça ne dessine rien car il n'y a rien à dessiner.
Ton objet Fenetre display n'est jamais utilisé. Il crée la JFrame fenetre, qui elle est affichée, mais qui ne contient pas le JPanel dont la méthode paint est définie.

Il faudrait au minimum que tu ajoutes le JPanel à la JFrame.

Remarque : il te manque aussi le super.paint(g) dans la méthode paint(Graphics)

public class fenetre extends JPanel { // panel de type fenetre
 
    JFrame fenetre = new JFrame(); // variable fenetre de type JFrame

    public void afficher() {
        fenetre.add(this); // ajout du JPanel de type fenetre dans la JFrame fenetre

Mais ton code est très confus, ce n'est pas au JPanel de créer la JFrame, mais l'inverse, sans parler de l'ambiguïté entre le type fenetre et l'objet fenetre...

Voici une correction de ton code :

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class Fenetre extends JFrame {
    private static final long serialVersionUID = 1L;

    public Fenetre() {
        setTitle("Ma fenetre Java");
        setSize(800, 600);
        getContentPane().setBackground(Color.DARK_GRAY);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g); // ne pas oublier !
        g.drawRect(10, 10, 15, 50);
    }
}

public class Main {
    public static void main(String[] args) {
        Fenetre fenetre = new Fenetre();
        fenetre.setVisible(true);
    }
}

Remarque : noir sur gris foncé ça ne se voit pas très bien, mais le rectangle est bien dessiné.
0