OVH Cloud OVH Cloud

Probleme de JComponents

3 réponses
Avatar
Michael
Bonjour, voici la situation et j'espere que l'on pourra m'eclairer.. :

Jai deux JComponents. L'un s'appelle "Tracer"; l'autre, sur le modele du
CoordinatesDemo sur le site java.sun.com, implemente MouseInputListener et
étend JComponent, et s'appelle "Mouse".

Mouse est donc un JComponent, qui a pour MouseMotionListener et
MouseListener luimeme. Sa methode paintComponent est redefinie pour
permettre d'afficher un petit carré sous le clic, ou un rectangle de
selection.

Dans Tracer, j'ai donc ajouté un composant Mouse, le but etant que dans ce
Tracer, Mouse recupere les evenements relatifs a la souris et dessine ce
qu'il faut.

1er probleme, la methode paintComponent de Tracer ne veut pas peindre Mouse,
même si je la redefinis et fais un paintChildren (J'ai bien verifié que
Mouse faisait partie des components de Tracer, donc normalement ça devrait
marcher). J'ai reglé ce probleme en appelant "((JComponent)
this.getComponent(0)).paint(g);" explicitement, et en changeant ma methode
"paintComponent" de Mouse en "paint" tout court, mais je ne comprend pas
pourquoi c'est necessaire ?

2e problème, la souris ne recupere rien du tout, comme le prouve le
println("Clic !") dans "mouseClicked(MouseEvent e)", qui ne s'affiche
jamais. En cherchant pourquoi rien ne se passe, je me suis rendu compte que
les methodes getWidth et getHeight dans Mouse, retournent toujours 0, malgré
des appels à setPreferredSize(new Dimension(400,300)) ou meme à
setMinimumSize(new Dim....). Est-ce que c'est bien ce qui empeche la souris
de fonctionner ?

J'ai l'impression que ces 2 problemes decoulent tous deux d'une mauvaise
comprehension de ma part en ce qui concerne la façon d'utiliser les
JComponents, donc si vous pouviez m'aider ça serait tres sympa :)

3 réponses

Avatar
Michael
Exemple : copier/coller dans Tracer.java
-----------------------------------------

import javax.swing.*;

import java.awt.*;
import java.awt.event.MouseEvent;
import javax.swing.event.MouseInputListener;

public class Tracer extends JComponent{

static final long serialVersionUID = 978978;
public Tracer()
{
setPreferredSize(new Dimension(400,300));
}

private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);

//Create and set up the window.
JFrame frame = new JFrame("Tracer/Mouse");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Set up the content pane.
Container jp = frame.getContentPane();
Tracer controller = new Tracer();
Mouse mouse = new Mouse(controller);
controller.add(mouse);
jp.add(controller);

//Display the window.
frame.pack();
frame.setVisible(true);
}

protected void paintComponent(Graphics g)
{
//paintChildren(g);
((JComponent) this.getComponent(0)).paint(g);
}

public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}

public static class Mouse extends JComponent
implements MouseInputListener {
Point point = null;
Tracer controller;
Dimension preferredSize = new Dimension(400,300);
static final long serialVersionUID = 99999;

public Mouse(Tracer controller) {
this.controller = controller;

setPreferredSize(preferredSize);
// setMinimumSize(preferredSize);
addMouseListener(this);
addMouseMotionListener(this);
setBackground(Color.WHITE);
setOpaque(true);
}

public Dimension getPreferredSize() {
return preferredSize;
}

public void paint(Graphics g) {

System.out.println("Paint mouse , width : " + getWidth() + ",
height : " + getHeight());
//Paint background if we're opaque.
if (isOpaque()) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}

//If user has chosen a point, paint a small dot on top.
if (point != null) {
g.setColor(getForeground());
g.fillRect(point.x - 3, point.y - 3, 7, 7);
}
}

protected void paintComponent(Graphics g) {

System.out.println("Paint mouse !");
//Paint background if we're opaque.
if (isOpaque()) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}

//If user has chosen a point, paint a small dot on top.
if (point != null) {
g.setColor(getForeground());
g.fillRect(point.x - 3, point.y - 3, 7, 7);
}
}

//Methods required by the MouseInputListener interface.
public void mouseClicked(MouseEvent e) {
System.out.println("Click !");
int x = e.getX();
int y = e.getY();
if (point == null) {
point = new Point(x, y);
} else {
point.x = x;
point.y = y;
}
repaint();
}

public void mouseMoved(MouseEvent e) {
System.out.println("move !");
}

public void mouseExited(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseDragged(MouseEvent e) { }
}
}
Avatar
TestMan
Bonsoir,

J'avoue que je comprend pas trop ton code ... il me parrait bien
complexe pour quelque chose qui semblerait ne pas nécessiter autant de
surcharge.

En premier, lire
http://java.sun.com/docs/books/tutorial/uiswing/14painting/concepts.html

Un petit tour ensuite sur
http://java.sun.com/docs/books/tutorial/uiswing/14painting/practice.html

Puis faire du nétoyage.

Par exemple :
((JComponent) this.getComponent(0)).paint(g);

J'ai jamais vu ce genre de code dans du swing ;-)

Si tu as besoin de plus d'aide, merci de reposer ici avec une
description précise de ce que tu cherche à faire au final ....

A+

TM


Michael wrote:
Bonjour, voici la situation et j'espere que l'on pourra m'eclairer.. :

Jai deux JComponents. L'un s'appelle "Tracer"; l'autre, sur le modele du
CoordinatesDemo sur le site java.sun.com, implemente MouseInputListener et
étend JComponent, et s'appelle "Mouse".

Mouse est donc un JComponent, qui a pour MouseMotionListener et
MouseListener luimeme. Sa methode paintComponent est redefinie pour
permettre d'afficher un petit carré sous le clic, ou un rectangle de
selection.

Dans Tracer, j'ai donc ajouté un composant Mouse, le but etant que dans ce
Tracer, Mouse recupere les evenements relatifs a la souris et dessine ce
qu'il faut.

1er probleme, la methode paintComponent de Tracer ne veut pas peindre Mouse,
même si je la redefinis et fais un paintChildren (J'ai bien verifié que
Mouse faisait partie des components de Tracer, donc normalement ça devrait
marcher). J'ai reglé ce probleme en appelant "((JComponent)
this.getComponent(0)).paint(g);" explicitement, et en changeant ma methode
"paintComponent" de Mouse en "paint" tout court, mais je ne comprend pas
pourquoi c'est necessaire ?

2e problème, la souris ne recupere rien du tout, comme le prouve le
println("Clic !") dans "mouseClicked(MouseEvent e)", qui ne s'affiche
jamais. En cherchant pourquoi rien ne se passe, je me suis rendu compte que
les methodes getWidth et getHeight dans Mouse, retournent toujours 0, malgré
des appels à setPreferredSize(new Dimension(400,300)) ou meme à
setMinimumSize(new Dim....). Est-ce que c'est bien ce qui empeche la souris
de fonctionner ?

J'ai l'impression que ces 2 problemes decoulent tous deux d'une mauvaise
comprehension de ma part en ce qui concerne la façon d'utiliser les
JComponents, donc si vous pouviez m'aider ça serait tres sympa :)




Avatar
Michael
Bonsoir,

Si tu ne l'as jamais vu, c'est que ce n'est pas un truc qu'on fait
habituellement, mais que jai utilisé ici pour regler partiellement un de mes
problemes, faute de mieux.

Je ne cherchais pas d'aide sur un probleme de conception mais sur un
probleme de comprehension, donc expliquer ce que je veux faire n'aurait que
detourné certains du vrai probleme; quoiqu'il en soit, quelqu'un sur
comp.lang.java.help m'a donné la solution, il s'agit simplement du fait que
les JComponents ne possedent pas de layout par defaut.

Cordialement,
Michael Roche


"TestMan" a écrit dans le message de news:
4382424a$0$13083$
Bonsoir,

J'avoue que je comprend pas trop ton code ... il me parrait bien
complexe pour quelque chose qui semblerait ne pas nécessiter autant de
surcharge.

En premier, lire
http://java.sun.com/docs/books/tutorial/uiswing/14painting/concepts.html

Un petit tour ensuite sur
http://java.sun.com/docs/books/tutorial/uiswing/14painting/practice.html

Puis faire du nétoyage.

Par exemple :
((JComponent) this.getComponent(0)).paint(g);

J'ai jamais vu ce genre de code dans du swing ;-)

Si tu as besoin de plus d'aide, merci de reposer ici avec une
description précise de ce que tu cherche à faire au final ....

A+

TM


Michael wrote:
Bonjour, voici la situation et j'espere que l'on pourra m'eclairer.. :

Jai deux JComponents. L'un s'appelle "Tracer"; l'autre, sur le modele du
CoordinatesDemo sur le site java.sun.com, implemente MouseInputListener
et


étend JComponent, et s'appelle "Mouse".

Mouse est donc un JComponent, qui a pour MouseMotionListener et
MouseListener luimeme. Sa methode paintComponent est redefinie pour
permettre d'afficher un petit carré sous le clic, ou un rectangle de
selection.

Dans Tracer, j'ai donc ajouté un composant Mouse, le but etant que dans
ce


Tracer, Mouse recupere les evenements relatifs a la souris et dessine ce
qu'il faut.

1er probleme, la methode paintComponent de Tracer ne veut pas peindre
Mouse,


même si je la redefinis et fais un paintChildren (J'ai bien verifié que
Mouse faisait partie des components de Tracer, donc normalement ça
devrait


marcher). J'ai reglé ce probleme en appelant "((JComponent)
this.getComponent(0)).paint(g);" explicitement, et en changeant ma
methode


"paintComponent" de Mouse en "paint" tout court, mais je ne comprend pas
pourquoi c'est necessaire ?

2e problème, la souris ne recupere rien du tout, comme le prouve le
println("Clic !") dans "mouseClicked(MouseEvent e)", qui ne s'affiche
jamais. En cherchant pourquoi rien ne se passe, je me suis rendu compte
que


les methodes getWidth et getHeight dans Mouse, retournent toujours 0,
malgré


des appels à setPreferredSize(new Dimension(400,300)) ou meme à
setMinimumSize(new Dim....). Est-ce que c'est bien ce qui empeche la
souris


de fonctionner ?

J'ai l'impression que ces 2 problemes decoulent tous deux d'une mauvaise
comprehension de ma part en ce qui concerne la façon d'utiliser les
JComponents, donc si vous pouviez m'aider ça serait tres sympa :)