Pattern observable - repérer des modifications d'une variable de type String
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:
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:
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 :)