Bonjour,

Tout d'abord je tiens à m'excuser pour ce doublon, j'ai déjà posé ma question dans une autre rubrique mais n'ayant pas eu de réponse, je me suis dit que je n'étais peut être pas dans la bonne catégorie (si c'est encore le cas, merci de me le faire savoir).

Voici mon problème.
J'ai un petit problème pour faire de l'édition de propriétés d'un javabean. Pour vous exposer mon problème, je me suis créé un petit javabean qui s'appelle Shape et qui est un composant dont on peut spécifier la couleur et la forme (ovale ou ronde).

Voilà le code de la classe Shape :

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
 
public class Shape extends javax.swing.JComponent  {
    protected java.awt.Color myColor;
 
    public void setColor(Color theColor) {
        Color old=myColor;
	myColor = theColor;
	repaint();
    }
 
    public Color getColor() {
	return myColor;
    }
 
    public final static int OVALE = 1;
    public final static int RECTANGLE = 2;
 
    protected int myShape;
 
    public void setShape(int theShape) {
    	int old=myShape;
        myShape = (theShape == OVALE || theShape == RECTANGLE) 
		? theShape
		: OVALE;
	repaint();
    }
 
    public int getShape() {
    	return myShape;
    }
 
    public void paint(Graphics g) {
        Color oldColor = g.getColor();
        g.setColor(myColor);
        switch (myShape) {
	case OVALE:
		g.fillOval(0, 0, getWidth(), getHeight());
		break;
	case RECTANGLE:
		g.fillRect(0, 0, getWidth(), getHeight());
		break;
	default:
		g.fillOval(0, 0, getWidth(), getHeight());
	}
        g.setColor(oldColor);
    }
 
    public Shape() {
	this(Shape.OVALE, Color.white);
    }
 
    public Shape(int theShape, Color theColor) {
	super();
	setShape(theShape);
	setColor(theColor);
    }
}

Pour exposer correctement les propriétés, je me suis écrit un bean info tout simple :

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
 
public class ShapeBeanInfo extends SimpleBeanInfo {
 
        public BeanDescriptor getBeanDescriptor() {
            BeanDescriptor bdesc = new 	BeanDescriptor(Shape.class);
            bdesc.setDisplayName ("Shape");
            return bdesc;
        }
 
        public PropertyDescriptor[] getPropertyDescriptors() {
            try {
                PropertyDescriptor pdesc1 = new PropertyDescriptor("color", Shape.class);
 
                PropertyDescriptor pdesc2 = new PropertyDescriptor("shape", Shape.class);
                pdesc2.setPropertyEditorClass(ShapeEditor.class);
 
                PropertyDescriptor[] pdesc = {pdesc1, pdesc2};
 
                return pdesc;
            } catch (IntrospectionException ex) {
                Logger.getLogger(ShapeBeanInfo.class.getName()).log(Level.SEVERE, null, ex);
                return null;
            }
        }
}

Et enfin je me suis créé un PropertyEditorSupport afin de pouvoir éditer la forme de l'objet sous une forme de combo box (choix entre "ovale" et "rectangle").
Voilà le code de la classe ShapeEditor

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
 
public class ShapeEditor extends PropertyEditorSupport {
	protected int myShape;
 
	public void setValue(Object obj) {
		myShape = ((Integer) obj).intValue();
	}
 
	public Object getValue() {
		return new Integer(myShape);
	}
 
	public String[] getTags() {
		String[] str = { "ovale", "rectangle" };
		return str;
	}
 
	public String getAsText() {
		switch (myShape) {
		case 1:
			return "ovale";
		case 2:
			return "rectangle";
		default:
			return "ovale";
		}
	}
 
	public void setAsText(String str) {
		if (str.equals("rectangle")) {
			myShape = 2;
		} else {
			myShape = 1;
		}
	}
}


Une fois que j'ai mis mon composant sur une JFrame, je peut modifier sa forme, on la voit bien changer.
Le problème c'est que si je regarde le code généré par le plugin Visual Editor que j'utilise pour faire de l'IHM sous Eclipse; il me génère le code suivant (pour la méthode qui me permet de créer mon composant Shape) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
private Shape getShape() {
		if (shape == null) {
			shape = new Shape();
			shape.setBounds(new Rectangle(15, 15, 115, 61));
			shape.setShape(???);
		}
		return shape;
	}

Il n'y a donc aucune chance pour que ce code fonctionne à l'éxécution à cause des ces points d'interrogation !
Donc j'ai l'impression que ma sélection de la forme n'est pas comprise ou alors que Visual Editor l'interprète mal, je ne sais pas trop ....
J'ai aussi essayé avec Netbeans et le résultat est le même. Je tiens aussi à préciser que si je vire complètement ces strings (ovale et rectangle) et que je dis par exemple que l'entier 1 correspond à ovale et 2 à rectangle alors ça marche trés bien. Mais sélectionner 1 ou 2 dans une combo box au lieu de ovale ou rectangle, ça revient pas tout à fait au même niveau compréhension par l'utilisateur :-D.


Pensez-vous que ma classe ShapeEditor soit correct ? Voyez vous la solution ?


Merci d'avance pour toutes les réponses que vous pourrez m'apporter.