Java affichage graphique 2D

kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005 - 10 sept. 2004 à 11:23
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 - 10 sept. 2004 à 17:00
bonjour,

je souhaiterais creer des formes graphiques basique en java qui contiennent du texte, par exemple tout simplement un rectangle avec du texte aligne en son centre

j'ai deja ecumer pas mal de tutoriaux et sites, cependant je n'ai trouver que cette reponse:


public void paint(Graphics g){

g.drawRect(RectX, RectY, 100, 50);
g.drawString("texte", textx,texty);

}


ca reviens a tricher c'est à dire dessiner le rectangle, puis ecrire du texte superpose par rapport a la position du rectangle

je suis certain qu'il y a un moyen de creer un rectangle dont on peut attribuer un texte pour l'affichage, ca a l'air tres basique!


si les librairies standards ne permettent pas de le faire, comment creer proprement une classe qui pourras me donner un objet de ce type?

c'est à dire que si je veux modifier le texte de ce rectangle je ferais par exemple :

rectangle.texte = "nouveau texte";


voila, je suis un newb autodidacte en java et c'est dur a apprehender toutes les classes...

7 réponses

cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
10 sept. 2004 à 13:05
c'est pas complique
tu cree une classe Rectangle et dans le constructeur tu lui passe en parametre les positions et la chaine
exemple :

class Rectangle
{
private int x1, y1, x2, y2;

public Rectangle(int x1, int x2, int y1, int y2)
{
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
}

public void trace(Graphics g)
{
g.setColor(Color.WHITE);
for (int i = 0; i < this.y2-this.y1; i++)
{
g.drawLine(this.x1, this.y1+i, this.x2, this.y1+i);
}
}
}

ca c'est ma classe, Il faut juste que tu rajoutes la chaine et dans la methode trace tu fais un drawString(chaine)

cid019
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
10 sept. 2004 à 13:18
GodConan :clown)

deja se que tu devra faire c est : rect.setText( "nouveau texte" );
et non pas rectangle.texte = "nouveau texte";

oui tu peu en effet crer ta propre class RectangleAvecText
qui aura sa propre facon de s afficher dans une methode jeMeDessine( Graphics g ) par exemple

et dc pour reprendre ton exemple tu devra faire :

public void paint(Graphics g){

laReferencSurTonRect.jeMeDessine( g );

}

avec

jeMeDessine( Graphics g )
{
g.drawRect(RectX, RectY, 100, 50);
g.drawString("texte", textx,texty);
}

et ca c est incontournable toute les primitive java de dessin ce trouve ds la class Graphics .... tu peu pas faire mieu

ceci dit si tu change le text de ton rect et que tu fait un repaint() tu aura le resultat attendu ;o) et cela te semblera automatic... ;o)

++
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
10 sept. 2004 à 13:19
GodConan :clown)

scuse cid javai pas vu ta reponce
0
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
10 sept. 2004 à 14:38
merci à vous 2 pour vos responses ca repond parfaitement à ce que je voulais faire ;)

par contre la j'ai des problemes de debutant au niveau de l'affichage

voici mes classes:

public class MainTest extends JFrame{

public MainTest(){

setSize(500, 500);
show();
}

public void paint(Graphics g){
Rectangle.trace( g );
}

public static void main(String args[]){
//int Rectx, int Recty, int RectLongx, int RectLongy

Rectangle app = new Rectangle(5, 10, 100, 50);

app.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);

}
}

public class Rectangle extends JFrame
{
private int Rectx, Recty, RectLongx, RectLongy;

public Rectangle(int Rectx, int Recty, int RectLongx, int RectLongy)
{
this.Rectx = Rectx;
this.Recty = Recty;
this.RectLongx = RectLongx;
this.RectLongy = RectLongy;
}

public void trace(Graphics g)
{
g.setColor(Color.WHITE);

g.drawRect(Rectx, Recty, RectLongx, RectLongy);
g.drawString("contenu", Rectx+20, Recty+5 );
}

}

ma question concerne la facon à laquelle l'affichage dois se faire:

ce que j'ai ecrit dans mes classes la dois etre une vraie aberation pour vous lol

je pense que c'est plus propre de creer le JFrame dans la classe qui appelle c'est à dire MainTest

par contre cette classe possede une methode static main(String args[]) donc cette classe n'est pas instanciee donc je ne passe pas par le constructeur, donc il n'y pas d'appel a la methode show(); donc la methode paint n'est pas appelle et l'affichage ne se fait pas

quelqu'un pourrais m'aider sur ce probleme tres basique?
0

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

Posez votre question
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
10 sept. 2004 à 14:44
bon j'ai fait ca mais c'est toujours aussi 'crado' si vous me permettez l'expression, mais vous devriez plus comprendre ce que j'essaie de faire

mon probleme reside dans l'affichage des Rectangle instancies en les envoyants dans la methode paint();

public class MainTest extends JFrame{

public MainTest(){
super("creation d'elements");
}

public void paint(Graphics g){
rec1.trace(g);
rec2.trace(g);
}

public static void main(String args[]){

MainTest app = new MainTest();

//int Rectx, int Recty, int RectLongx, int RectLongy
Rectangle rec1 = new Rectangle(5, 10, 100, 50);
Rectangle rec2 = new Rectangle(105, 10, 100, 50);

setSize(500, 500);
show();

app.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);

}
}
0
kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005
10 sept. 2004 à 15:08
oubliez le message d'au dessus j'ai presque reussi à obtenir le bon resultat (est-ce propre pour de l'objet au moins ce que je fait lol...)

alors maintenant j'ai plus ou moins presque reussi à 'esquisser' ce que je voulais faire, voici mes classes:



public class MainTest extends JFrame{

public MainTest(){
super("creation d'elements");

setSize(500, 500);
show();
}

public void paint(Graphics g){

Rectangle rec1 = new Rectangle(5, 10, 100, 50);
Rectangle rec2 = new Rectangle(115, 10, 100, 50);

rec1.trace(g);
rec2.trace(g);
}

public static void main(String args[]){

MainTest app = new MainTest();

//int Rectx, int Recty, int RectLongx, int RectLongy

app.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);


}
}


public class Rectangle extends JFrame
{
private int Rectx, Recty, RectLongx, RectLongy;
private static int textx, texty;

public Rectangle(int Rectx, int Recty, int RectLongx, int RectLongy)
{
this.Rectx = Rectx;
this.Recty = Recty;
this.RectLongx = RectLongx;
this.RectLongy = RectLongy;

textx = Rectx + 20;
texty = Recty + 5;
}

public void trace(Graphics g)
{
g.setColor(Color.WHITE);

g.drawRect(Rectx, Recty, RectLongx, RectLongy);
g.drawString("contenu", textx, texty);

System.out.println("coordonnee"+textx+ ", "+ texty);
}

}


par contre le probleme que j'ai c'est pour afficher le texte à 'l'interieur ' des rectangles

en effet le g.drawString() n'affiche rien, pensant que c'etait du à l'instance j'ai mis textx et texy qui sont les coordonnees d'affichage du texte en static


dans l'ordre:

1- instanciation des rectangles (calcul coordonnees affichage rectangle + texte)

2- appel a la fonction trace de chacun des objet pour les tracers dans la JFrame, le probleme c'est que le texte ne s'affiche pas

-> j'ai essaye de mettre un bloc en dur et celui-ci s'affiche tout a fait correctement:

public void trace(Graphics g)
{
g.setColor(Color.WHITE);

g.drawRect(Rectx, Recty, RectLongx, RectLongy);
g.drawString("contenu", textx, texty); // n'affiche rien
g.drawString("contenu", 250, 50); // s'affiche correctement

System.out.println("coordonnee"+textx+ ", "+ texty);
}
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
10 sept. 2004 à 17:00
GodConan :clown)

c tou a fait comme cela kil te faut faire mais remplace dc
private int Rectx, Recty, RectLongx, RectLongy;

par la class Rectangle ;o) c bcp plus joli et ca ser a ca ;o)

ensuite je voi que tu fai tou t tracer en blan ;o)
dc si tu change pas la couleur le text aussi sera blan ;o)
jespere ton fond ne l ai pas ;o) héh autrement c normal de rien voir...

pour coord Text utilise pluto des coord relative a ton rectangl et dc juste des constance d increment c + simple et logik.

ensuite il faut savoir que la coord utilise par le drwString point en bas a gauche de la chaine afficher dc si tu affiche tro haut tu ne la vera pas ...

A vi gro truc : ne fait extend Rectangle de JFrame ;o) c tro pas util ;o) t as rien besoin de JFrame ds ta class

Autrement ton code est juste voi pas pkoi ca saffiche pas ...
et appel la autrement Rectangle c une class de java.awt ;o)
ca porte a confusion .. ;o)

GL
0
Rejoignez-nous