1

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. enter image description hereInteraction 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) { 

    } 
} 

Répondre

0

Cela peut venir un peu en retard, mais je travaillais sur un projet Java cette semaine et j'ai eu le même problème que celui que vous avez décrit ci-dessus.

En cherchant une solution, j'ai trébuché sur votre question. Comme il n'a pas encore de réponse, j'ai pensé qu'il pourrait être utile de revenir ici et de décrire comment j'ai résolu le problème (peut-être que cela vous aidera ou aidera quelqu'un d'autre à l'avenir). Donc, il semble que l'API Swing nous aide ici en offrant une méthode très agréable nommée getValueIsAdjusting. Cette méthode fait partie de la classe JSlider.

Comment cela résout-il le problème?

Nous modifions la méthode stateChanged de la ChangeListener mise en œuvre:

@Override 
public void stateChanged(ChangeEvent ce) { 
    JSlider source = (JSlider)ce.getSource(); 

    if (source.getValueIsAdjusting()) { 
     if (source == sldRed) 
      txtRed.setText(Integer.toString(sldRed.getValue())); 
     else if (source == sldGreen) 
      txtGreen.setText(Integer.toString(sldGreen.getValue())); 
     else if (source == 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)); 
} 

L'instruction if (source.getValueIsAdjusting()) fait les setText « s ne se manifestent que si vous êtes toujours « ajustement » du curseur (cela signifie que vous traînez toujours avec la souris).

écriture d'une valeur dans le JTextField déclenchera la méthode stateChanged des curseurs, mais il ne sera pas appel aux setText « s, parce que la valeur du curseur est pas « réglage ».

Ainsi, vous vous débarrassez de l'exception.