Bonjour à tous,

J'en suis à ma 1ère année de java, et je cherche à développer un petit logiciel de comptabilité. Pour cela l'utilisateur rentre des catégories et des sous-catégories afin que lorsqu'il souhaite rajouter une dépense (recette, prélevement, virement) le logiciel puisse s'en servir. Je ne vous fournis pas le code car ce n'est pas intéressant ici. En revanche, j'ai supposé que l'utilisateur puisse se tromper et pour cela je me suis dit que dans l'affichage des sous-catégories, je devais permettre à l'utilisateur de pouvoir modifier ce qu'il a rentré.
J'ai donc 2 classes, une qui s'appelle "Titre" qui extends JPanel, qui est construite avec un label et une autre qui s'appelle "TitreJtxt" qui permet d'effectuer le changement de nom de la sous-catégorie.

voici les codes correspondants :

Titre :

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
 package Objet;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
 
import javax.swing.JLabel;
import javax.swing.JPanel;
 
public class Titre extends JPanel {
	/**
         * 
         */
	private static final long serialVersionUID = 1L;
	protected JLabel label = new JLabel();
	protected String str;
	protected Font police;
 
	public Titre() {
	}
 
	public Titre(String str, int size, Color color) {
		this.setOpaque(false);
		this.str = str;
		police = new Font("MS sans Serif", Font.PLAIN, size);
		this.setFont(police);
		FontMetrics fm = getFontMetrics(police);
		this.setPreferredSize(new Dimension(fm.stringWidth(str) + 20, 30));
		label.setHorizontalAlignment(JLabel.LEFT);
		label.setVerticalAlignment(JLabel.NORTH);
		label.setText(str);
		label.setFont(police);
		label.setForeground(color);
		this.add(label);
	}
 
	public String getStr() {
		return str;
	}
 
	public void setString(String str) {
		label.setText(str);
	}
}
TitreJtxt :

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package Objet;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
 
import javax.swing.JTextField;
 
 
public class TitreJtxt extends Titre implements MouseListener, KeyListener {
	/**
         * 
         */
	private static final long serialVersionUID = 1L;
	protected JTextField JText;
 
	public TitreJtxt() {
 
	}
 
	public TitreJtxt(String str, int size, Color color) {
		super(str, size, color);
		label.addMouseListener(this);
		JText = new JTextField(str);
		JText.addKeyListener(this);
	}
 
	public void toJTextField() {
		this.removeAll();
		JText.setPreferredSize(this.getSize());
		this.add(JText);
		revalidate();
		repaint();
		JText.setText(str);
		JText.setSelectionStart(0);
		JText.setSelectionEnd(str.length());
		JText.requestFocus();
	}
 
	public void toTitre() {
		this.removeAll();
		FontMetrics fm = getFontMetrics(getFont());
		try {
			this.setPreferredSize(new Dimension(fm.stringWidth(str) + 20, 30));
		} catch (NullPointerException e) {
 
		}
		label.setText(str);
		label.notify();
		this.add(label);
		revalidate();
		repaint();
	}
 
	@Override
	public void mouseClicked(MouseEvent e) {
		if (e.getClickCount() == 2)
			toJTextField();
	}
 
	@Override
	public void mouseEntered(MouseEvent e) {
 
	}
 
	@Override
	public void mouseExited(MouseEvent e) {
 
	}
 
	@Override
	public void mousePressed(MouseEvent e) {
 
	}
 
	@Override
	public void mouseReleased(MouseEvent e) {
 
	}
 
	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_ENTER) {
			str = JText.getText();
			toTitre();
		} else if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
			toTitre();
	}
 
	@Override
	public void keyReleased(KeyEvent e) {
 
	}
 
	@Override
	public void keyTyped(KeyEvent e) {
 
	}
 
	public JTextField getJText() {
		return JText;
	}
}
Maintenant, ce que je souhaite faire, c'est que lorsque je change ma variable str, dans la fonction toTitre, je "notifie" à un modelcontroller qu'il y a eu un changement et donc qu'il mette à jour la liste de sous catégories avec le nouveau nom de sous catégorie.

Je pensais utiliser un pattern observable, mais comme j'ai déjà extends JPanel je ne peux pas, mais je ne sais pas du tout comment procéder..

Désolé pour le pavé (un peu) long, mais il faut des explications claires.

Je vous souhaite une bonne lecture et toute aide est la bienvenue