J'ai un panneau contenant des champs de texte (rouge, vert, bleu) et des curseurs (rouge, vert, bleu). Les utilisateurs sont censés être en mesure d'utiliser celui qu'ils préfèrent, et le composant correspondant devrait mettre à jour. (Par exemple, entrer 100 dans le champ de texte rouge devrait déplacer le curseur rouge à 100). Puisque je veux que les curseurs mettent à jour pendant que le texte est inséré ou a été supprimé, j'ai créé un simple DocumentListener. Cependant, j'obtiens le message d'erreur "java.lang.IllegalStateException: Tentative de muter dans la notification." Mon programme est confus quant à savoir s'il devrait d'abord mettre à jour le curseur ou le champ de texte. Y a-t-il un moyen de résoudre ce problème? Je vais poster mes deux classes ci-dessous, et une photo de l'interface graphique sera également jointe pour une référence rapide. Interaction entre JTextField et JSlider - DocumentListener est confus
public class ColorChooser extends javax.swing.JPanel implements ChangeListener {
private Vector listeners;
public ColorChooser() {
initComponents();
listeners = new Vector();
sldRed.addChangeListener(this);
sldGreen.addChangeListener(this);
sldBlue.addChangeListener(this);
txtRed.setText("0");
txtGreen.setText("0");
txtBlue.setText("0");
Document docRed = txtRed.getDocument();
docRed.addDocumentListener(new MyDocumentListener(txtRed, sldRed));
Document docGreen = txtGreen.getDocument();
docGreen.addDocumentListener(new MyDocumentListener(txtGreen, sldGreen));
Document docBlue = txtBlue.getDocument();
docBlue.addDocumentListener(new MyDocumentListener(txtBlue, sldBlue));
}
// Variables declaration - do not modify
private javax.swing.JLabel labelBlue;
private javax.swing.JLabel labelGreen;
private javax.swing.JLabel labelRed;
private javax.swing.JSlider sldBlue;
private javax.swing.JSlider sldGreen;
private javax.swing.JSlider sldRed;
private jcolorchooser.JColorIntegerField txtBlue;
private jcolorchooser.JColorIntegerField txtGreen;
private jcolorchooser.JColorIntegerField txtRed;
// End of variables declaration
@Override
public void stateChanged(ChangeEvent ce) {
if (ce.getSource() == sldRed) {
txtRed.setText(Integer.toString(sldRed.getValue()));
}
if (ce.getSource() == sldGreen) {
txtGreen.setText(Integer.toString(sldGreen.getValue()));
}
if (ce.getSource() == sldBlue) {
txtBlue.setText(Integer.toString(sldBlue.getValue()));
}
int r = sldRed.getValue();
int g = sldGreen.getValue();
int b = sldBlue.getValue();
Color color = new Color(r,g,b);
fireColorEvent(new ColorEvent(this,color));
}
private void fireColorEvent(ColorEvent colorEvent){
Vector v;
synchronized(this){
v = (Vector)listeners.clone();
}
int size = v.size();
for(int i=0; i<size; i++){
ColorListener colorListener = (ColorListener)v.elementAt(i);
colorListener.changeColor(colorEvent);
}
}
public void addColorListener(ColorListener colorListener){
listeners.addElement(colorListener);
}
public void removeColorListener(ColorListener colorListener){
listeners.removeElement(colorListener);
}
}
//DocumentListener Class
public class MyDocumentListener implements DocumentListener {
private JColorIntegerField jColorIntegerField;
private JSlider jColorSlider;
public MyDocumentListener(JColorIntegerField jColorIntegerField,
JSlider jColorSlider) {
this.jColorIntegerField = jColorIntegerField;
this.jColorSlider = jColorSlider;
}
public void insertUpdate(DocumentEvent de) {
if (jColorIntegerField.getText().equals("")) {
jColorSlider.setValue(0);
}
else {
jColorSlider.setValue(Integer.parseInt(
jColorIntegerField.getText()));
}
}
@Override
public void removeUpdate(DocumentEvent de) {
if (jColorIntegerField.getText().equals("")) {
jColorSlider.setValue(0);
}
else {
jColorSlider.setValue(Integer.parseInt(
jColorIntegerField.getText()));
}
}
@Override
public void changedUpdate(DocumentEvent de) {
}
}