2013-02-21 2 views
1

... ou peut-être ma programmation est le comportement étrange ...JSlider getValueIsAdjusting comportement étrange

Je suis en train de créer une classe que j'utilise beaucoup dans mon programme. C'est une classe qui crée un contrôle JPanel qui contient un Jlabel en haut dans un volet et un JSlider et JSpinner dans un autre volet. Je veux que le JSpinner change quand le JSlider change et vice versa. Je veux que leur valeur soit liée les uns aux autres. C'est pour le plaisir de la JSpinner affiner la sélection JSpinner.

Voici le code de la classe ("ij" les importations sont pour l'application ImageJ du gouvernement):

import ij.*; 
import ij.process.*; 
import ij.gui.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class LabeledSliderSpinner extends JPanel implements ChangeListener { 

JPanel sspanel = new JPanel(); 
JSlider slider; 
SpinnerModel model; 
JSpinner spinner; 

public LabeledSliderSpinner() {} 

public LabeledSliderSpinner(String label, int left, int x, int right) { 

    JLabel sslabel = new JLabel(label); 

    JSlider slider = new JSlider(JSlider.HORIZONTAL, left, right, x); 
    slider.setMajorTickSpacing(25); 
    slider.setMinorTickSpacing(5); 
    slider.setPaintTicks(true); 
    slider.setPaintLabels(true); 
    slider.setPaintTrack(true); 
    slider.setVisible(true); 

    slider.addChangeListener(this); 

    model = new SpinnerNumberModel(x, left, right, 1); 
    JSpinner spinner = new JSpinner(model); 
    spinner.setEditor(new JSpinner.NumberEditor(spinner, "####")); 

    spinner.addChangeListener(this); 

    sspanel.add(slider); 
    sspanel.add(spinner); 

    add(sslabel); 
    add(sspanel); 
    setVisible(true); 
} 

public void stateChanged(ChangeEvent e) { 
    String a = ""; 

    Object o = e.getSource(); 
    Class c = o.getClass(); 
    String controlName = c.getName(); 


    if (controlName == "javax.swing.JSpinner") { 
// not coded yet 
    } 

    else 

    if (controlName == "javax.swing.JSlider") { 
     if (!slider.getValueIsAdjusting()) { 
      int fps = (int)slider.getValue(); 
      spinner.setValue(new Integer(fps)); 
     } 
    } 

} 
} 

Il est appelé comme ceci:

LabeledSliderSpinner lss = new LabeledSliderSpinner("Homing Line", minx, x, maxx);

Dans la méthode stateChanged , J'ai déterminé que quand il atteint le test getValueIsAdjusting, il ne termine même pas la méthode stateChanged. Cela revient simplement à la fonction principale. Le bouton du curseur se déplace. La valeur de spinner ne change pas. J'ai même ouvert une boîte de dialogue dans le test getValueIsAdjusting. Il ne le fait jamais. J'ai essayé d'ouvrir une boîte de dialogue comme condition supplémentaire au test getValueIsAdjusting et n'ouvre jamais une boîte de dialogue. Il revient juste de stateChanged().

Je pourrais utiliser un meilleur moyen de déterminer si le stateChanged est appelé à cause du curseur ou du spinner.

Répondre

2

SpinSlider peut être utile dans ce contexte.

image

+0

Cela fonctionne très bien! Merci. Je me demande toujours ce qui n'allait pas avec le mien. – PDog

+0

Vous êtes les bienvenus. Je ne suis pas sûr, mais je pense que vous avez besoin des changements d'ajustement, aussi. – trashgod