2015-08-25 2 views
2

J'essaie de remplacer paintThumb pour afficher un curseur graphique. Tant que je ne plaisante pas avec la taille de l'image et que je la laisse peindre en fonction de la taille du pouce, l'image du pouce et le curseur fonctionnent correctement. Si je change la taille de thumbRect ou mon image, je ne peux pas saisir le pouce ou déplacer le curseur ne fonctionne plus. C'est un JSlider vertical.Java Swing JSlider (Vertical) thumbRect modifie le contrôle du curseur

NOTE: Merci à trashgod pour la solution. Voir dans le code.
NOTE2: MIS À JOUR POUR ÊTRE MAINTENANT UN EXEMPLE DE TRAVAIL ACCEPTABLE.
NOTE3: Le problème d'origine a été causé par le redimensionnement à l'intérieur de paintThumb.

Voici le curseur:

sliders[channel].setUI(new customSliderHandle(sliders[channel], busType)); 

est ici la classe:

private static class customSliderHandle extends BasicSliderUI { 

    String sBusType; 
    Image image; 

    public customSliderHandle(JSlider slider, String busType) { 
     super(slider); 

     sBusType = busType; 

     try { 
      if(sBusType.equals("ch")) { 
       //noinspection ConstantConditions 
       image = ImageIO.read(getClass().getClassLoader().getResource("web/images/black-slider.png")); 
      } else { 
       //noinspection ConstantConditions 
       image = ImageIO.read(getClass().getClassLoader().getResource("web/images/yellow-slider.png")); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void calculateThumbSize() { 
     super.calculateThumbSize(); 

     //// Fixed!!! 
     thumbRect.setSize(20, 40); 
    } 

    @Override 
    public void paintThumb(Graphics g) { 

     ///// This was the original problem. Move into 
     ///// calculateThumbSize() resolved the problem. 
     ///// thumbRect.setSize(20, 40); 

     int x = thumbRect.x; 
     int y = thumbRect.y; 
     int width = thumbRect.width; 
     int height = thumbRect.height; 
     g.drawImage(image, x, y, width, height, null); 
    } 
} 

Répondre

3

Au moment paintThumb() est appelé, BasicSliderUI a déjà calculé thumbRect en fonction du résultat de getThumbSize(). De plus, en raison de sa latence inconnue, vous ne devez pas appeler ImageIO.read() à l'intérieur de paint(). Au lieu de cela, chargez l'image de manière asynchrone, en utilisant peut-être SwingWorker comme indiqué here et utilisez les dimensions de l'image dans votre implémentation de getThumbSize(). Notez que vous devez prendre en compte le résultat de getOrientation() si votre image n'est pas carré.

+0

J'apprécie tellement SO et ceux qui aident! Je viens de mettre thumbRect.setSize (20,40) dans calculateThumbSize() override et cela a fonctionné. Je ne sais pas exactement comment simplifier la gestion de l'image, mais c'est certainement la réponse. Je mettrai à jour mon OP –

+0

Si je déplace le ImageIO hors paintThumb et dans la méthode parente (customSliderHandle) et place la déclaration dans la classe (comme je l'ai fait avec sBusType) ça ira? –

+0

@JohnSmith: Passer une référence dans le constructeur sonne bien. – trashgod