Problème dessin en Java

Fermé
momop78 - 1 déc. 2013 à 00:32
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 1 déc. 2013 à 17:34
Bonjour,

Je souhaite faire une fenêtre qui permette d'afficher une ligne, un cercle ou un rectangle en fonction d'un bouton cliqué, en plus de cela, un texte affichant qu'elle forme est dessiné apparait en bas de ma fenêtre. Ce doit être tout bête mais je n'arrive pas à afficher la forme, alors que le reste s'affiche convenablement. Pourriez vous me dire où j'ai faux ?

Voici mon code :

public class EssaiMain {

public static void main(String[] args) {
JFrame fenetre = new JFrame ();
FormesGeometriques fenetre2 = new FormesGeometriques();
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenetre.setTitle("Cabinet Medical PIC'OUZ");
fenetre.setSize(700, 500);
fenetre.setVisible(true);
fenetre.add(fenetre2);
}
}

public class FormesGeometriques extends JPanel{

private static final long serialVersionUID = 1L;

public static String typeForme = "ligne";

private JButton jbLigne = new JButton ("Ligne");
private JButton jbCercle = new JButton ("Cercle");
private JButton jbRectangle = new JButton ("Rectangle");

private JPanel monPanel = new JPanel (new FlowLayout());
private JLabel jbForme = new JLabel ("Ligne");
private JPanel dessinPanel = new JPanel (new FlowLayout());

protected void paintComponent (Graphics g) {
super.paintComponent (g);
if ("ligne".equals(typeForme)) {
g.drawLine(10, 10, 200, 100);
}
else if ("cercle".equals(typeForme)){
g.drawOval(10, 10, 200, 100);
}
else {
g.drawRect(10, 10, 100, 200);
}
}

public FormesGeometriques (){
monPanel.add(jbLigne);
monPanel.add(jbCercle);
monPanel.add(jbRectangle);
this.setLayout(new BorderLayout());
this.add(monPanel, BorderLayout.NORTH);
this.add(jbForme, BorderLayout.SOUTH);
this.add(dessinPanel, BorderLayout.CENTER);
jbLigne.addActionListener(new FormeActionListener());
jbCercle.addActionListener(new FormeActionListener());
jbRectangle.addActionListener(new FormeActionListener());
}

public class FormeActionListener implements ActionListener {

@Override
public void actionPerformed (ActionEvent e) {
if (e.getSource().equals(jbLigne)) {
jbForme.setText ("Ligne");
FormesGeometriques.typeForme = "ligne";
}

else if (e.getSource().equals(jbCercle)) {
jbForme.setText ("Cercle");
FormesGeometriques.typeForme = "cercle";
}

else {
jbForme.setText ("Rectangle");
FormesGeometriques.typeForme = "rectangle";
}
}
}

}


Merci de votre aide.

A voir également:

1 réponse

C'est bon j'ai réussi en ajoutant une classe DessinPanel et en y mettant ma méthode paintComponent, cependant ça me semble un peu étrange comme façon de faire, n'y aurait-il pas moyen de lier directement mon attribut dessinPanel à la méthode paintComponent dans la classe FormesGeometriques ?
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
1 déc. 2013 à 17:34
Ce n'est pas vraiment étrange comme façon de faire, un Panel est un conteneur, tu lui ajoutes donc des composants (les trois boutons) qui sont eux la partie visible. Si tu utilises le Panel également pour faire ton paintComponent tu perds alors la notion de conteneur/contenu.
Il est donc plutôt logique de rajouter un autre composant (ton DessinPanel) qui s'occupe de l'affichage de tes figures, comme ça FormesGeometriques reste exclusivement un conteneur.

Ce qu'il faudrait faire pour que ça fonctionne directement ce n'est pas redéfinir la méthode paintComponent (qui est la méthode des conteneurs), mais redéfinir la méthode paint (qui est la méthode des composants).

@Override
public void paint(Graphics g)
{
    super.paint(g);
    
    if ("ligne".equals(typeForme))
    {
        g.drawLine(50, 50, 200, 100);
    }
    else if ("cercle".equals(typeForme))
    {
        g.drawOval(50, 50, 200, 100);
    }
    else
    {
        g.drawRect(50, 50, 100, 200);
    }
}

Il manquera plus qu'un petit truc : mettre un
repaint();
à la fin de ton actionPerformed, sinon ça ne prendra pas en compte la modification.

Remarque : je pense que ton objet typeForme ne devrait pas être static.
0