2012-06-03 4 views
0

J'essaie de peindre des rectangles de couleur de largeur égale sous un JSlider de sorte que les graduations séparent les couleurs. Je suis vraiment proche, mais je ne peux pas l'obtenir tout à fait parfait. J'ai imprimé un tas de valeurs et mon problème est la largeur du curseur n'est pas la longueur réelle de la barre coulissante. La position x du curseur n'est pas non plus l'emplacement de départ de la barre. Voici mon code définissant mes limites de Rectangles colorés en termes de position des curseurs.Java Applet JSlider largeur

for(int i = 0; i < Global.emSpectrum.length; i++) //emSpectrum.length is the number of colored rectangles 
{ 
    emSpectrum.get(i).setColorRect(Global.emSpectrum[i], 13 + i * (int)((this.slider.getWidth())/Global.emSpectrum.length),  //13 lines up the first color under the bar 
    this.slider.getY() + this.slider.getHeight()/2, (int)((this.slider.getWidth())/Global.emSpectrum.length), 
    (int)(Global.rectHeight * getHeight())); 
} 

Est-il juste une meilleure façon d'aller à ce sujet?

Merci!

+0

Si vous ne recevez pas une réponse décente bientôt, envisager la création et l'affichage d'un (http://sscce.org) [sscce]. Cela nous aiderait beaucoup plus facilement, et vous obtiendrait probablement une solution décente plus tôt. –

+0

Dans votre code, vous avez un commentaire, "13 lignes la première couleur sous la barre." Je suppose que vous l'avez étalonné manuellement, en changeant le nombre jusqu'à ce que vous l'obteniez juste à 13? Si c'est le cas, ce n'est * pas * le moyen de le faire. Que se passe-t-il si vous l'exécutez sur un système d'exploitation différent, avec un aspect différent (http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html)? – wchargin

+0

Envisagez d'utiliser une table d'étiquettes personnalisée pour votre JSlider. Vous devez le définir à l'aide de la méthode 'setLabelTable (...)' conformément à l'API. –

Répondre

4

Oui, une bonne solution est d'utiliser un dictionnaire tel qu'un HashTable<Integer, JLabel> et de le remplir avec JLabels qui contiennent ImageIcons de vos rectangles de couleur, en utilisant un entier qui correspond à l'emplacement approprié sur le JSlider. Par exemple, mon SSCCE:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.util.Dictionary; 
import java.util.Hashtable; 

import javax.swing.*; 

public class SliderEg extends JPanel { 
    public static final Color[] COLORS = { Color.red, Color.orange, 
     Color.yellow, Color.green, Color.blue, Color.cyan}; 
    private static final int BI_W = 30; 
    private static final int BI_H = 10; 
    private JSlider slider = new JSlider(0, 100, 0); 

    public SliderEg() { 
     int majorSpacing = slider.getMaximum()/(COLORS.length - 1); 
     Dictionary<Integer, JLabel> dictionary = new Hashtable<Integer, JLabel>(); 
     slider.setMajorTickSpacing(majorSpacing); 
     slider.setPaintLabels(true); 
     slider.setPaintTicks(true); 
     slider.setSnapToTicks(true); 
     for (int i = 0; i < COLORS.length; i++) { 
     ImageIcon icon = createColorIcon(COLORS[i]); 
     JLabel label = new JLabel(icon); 
     int key = i * majorSpacing; 
     dictionary.put(key, label); 
     } 
     slider.setLabelTable(dictionary); 

     setLayout(new BorderLayout()); 
     add(slider, BorderLayout.CENTER); 
    } 

    private ImageIcon createColorIcon(Color color) { 
     BufferedImage img = new BufferedImage(BI_W, BI_H, 
      BufferedImage.TYPE_INT_RGB); 
     Graphics g = img.getGraphics(); 
     g.setColor(color); 
     g.fillRect(0, 0, BI_W, BI_H); 
     g.dispose(); 

     return new ImageIcon(img); 
    } 

    private static void createAndShowGui() { 
     SliderEg mainPanel = new SliderEg(); 

     JFrame frame = new JFrame("SliderEg"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

Merci! Cela a l'air plutôt cool! Je vais essayer demain. – CodeKingPlusPlus

+0

Ceci est proche de ce que je veux ... Je veux que les couleurs soient continues sur l'échelle du curseur (pas d'espace entre elles). – CodeKingPlusPlus

+0

N'hésitez pas à modifier le code si nécessaire. –