2013-03-08 2 views
4

Comme expliqué dans le titre, j'ai fait un simple JSlider, et j'ai réussi à définir une valeur minimum et maximum, et un espacement de coche mineur, puis j'ai mis le "setSnapToTicks" à true. Aucun problème avec cette partie, mon bouton bouge sur le tick le plus proche lorsque l'utilisateur lâche la souris, ça ne peut pas être plus facile.JSlider: impossible de faire bouger le bouton sur la coche la plus proche pendant le glissement

Mais maintenant je veux obtenir cet effet sans relâcher la souris, le bouton doit se déplacer en tic tac sans faire attention aux valeurs entre ces ticks, je veux qu'il "saute" uniquement sur les valeurs de ticks. Je viens de faire de nombreuses recherches, et je n'ai pas trouvé la réponse, je viens de parler de "setExtent", qui est censé définir le genre d'étape que je cherche, mais cela n'a pas fonctionné après un débogage. Voici ma simple déclaration du JSlider:

sliderFlightLevel = new JSlider(); 
sliderFlightLevel.setValue(100); 
sliderFlightLevel.setMinorTickSpacing(100); 
sliderFlightLevel.setMinimum(100); 
sliderFlightLevel.setMaximum(50000); 
GridBagConstraints gbcSliderFlightLevel = new GridBagConstraints(); 
gbcSliderFlightLevel.gridwidth = 3; 
gbcSliderFlightLevel.insets = new Insets(0, 10, 5, 10); 
gbcSliderFlightLevel.fill = GridBagConstraints.HORIZONTAL; 
gbcSliderFlightLevel.gridx = 0; 
gbcSliderFlightLevel.gridy = 1; 
mainPanel.add(sliderFlightLevel, gbcSliderFlightLevel); 

Merci pour la lecture, j'espère que je vais obtenir de l'aide :)

+0

Comme mentionné dans ma réponse, le comportement serpentine dépend certainement du look & feel que vous utilisez. Pourriez-vous nous dire lequel vous utilisez? – barjak

+0

Il ressemble au noyau de métal sur le lien que vous avez posté. C'est ce que vous devez savoir? (Je suis désolé mais je travaille sur un grand projet existant et je n'ai pas pris soin de toutes les spécifications graphiques qui sont déjà développées en) – StarBuzz

+0

Oui, c'est l'information dont j'ai besoin. C'est logique, parce que Metal est le look par défaut (mais malheureusement moche!). – barjak

Répondre

1

Je pense que ce comportement est contrôlé par le délégué de l'interface utilisateur du composant (SliderUI). Vous pouvez essayer un autre aspect &, ou vous pouvez essayer de configurer celui que vous utilisez.

Vous pouvez également installer un autre délégué de l'interface utilisateur sur votre composant.

Voir ceci real world example of customizing the behavior of a swing component.

Modifier

je suis venu avec un hack laid qui fait le travail. Ce code dépend complètement des détails d'implémentation de la classe BasicSliderUI (qui est utilisé par la plupart des aspects &).

import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 
import javax.swing.JSlider; 
import javax.swing.plaf.metal.MetalSliderUI; 

public class MetalSnapSliderUI extends MetalSliderUI { 

    private MouseMotionListener myMouseMotionListener = new MouseMotionListener() { 

     public void mouseDragged(MouseEvent e) { 
      trackListener.mouseDragged(e); 
      calculateThumbLocation(); 
      slider.repaint(); 
     } 

     public void mouseMoved(MouseEvent e) { 
      trackListener.mouseMoved(e); 
     } 

    }; 

    @Override 
    protected void installListeners(JSlider slider) { 
     super.installListeners(slider); 
     slider.removeMouseMotionListener(trackListener); 
     slider.addMouseMotionListener(myMouseMotionListener); 
    } 

    @Override 
    protected void uninstallListeners(JSlider slider) { 
     super.uninstallListeners(slider); 
     slider.removeMouseMotionListener(myMouseMotionListener); 
    } 

} 

Vous devez installer cette interface sur le JSlider:

JSlider s = new JSlider(); 
    s.setUI(new MetalSnapSliderUI()); 
Questions connexes