2012-06-03 61 views
0

我想在JSlider下畫相同寬度的彩色矩形,使刻度標記分開的顏色。我非常接近,但不能完美。我已經打印出一堆值,我的問題是滑塊的寬度不是滑動條的實際長度。滑塊的x位置也不是條的起始位置。這裏是我的代碼根據滑塊位置設置我的彩色矩形邊界。Java小程序JSlider寬度

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())); 
} 

難道還有更好的方法嗎?

謝謝!

+0

如果您很快就得不到體面的答案,請考慮創建併發布[sscce](http://sscce.org)。這會讓我們更容易幫助你,並且可能會盡快爲你提供一個體面的解決方案。 –

+0

在你的代碼中,你有一條評論,「13條排列欄下的第一個顏色。」我假設你手動校準了它,改變了這個數字,直到你在13點得到它爲止?如果是這樣,這是*不是*的方式來做到這一點。如果您在不同的操作系統上運行它,並使用不同的[外觀和感覺](http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html),會發生什麼? – wchargin

+0

考慮爲您的JSlider使用自定義標籤表。您可以根據API使用'setLabelTable(...)'方法來設置它。 –

回答

4

是的,一個體面的解決方案是使用一個字典,如HashTable<Integer, JLabel>,並用JLabels填充顏色矩形的ImageIcons,使用與JSlider上適當位置相對應的Integer。例如,我的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

謝謝!這看起來很酷!我明天會試一試。 – CodeKingPlusPlus

+0

這與我想要的很接近......我希望顏色在滑塊的比例尺上連續(它們之間沒有空間)。 – CodeKingPlusPlus

+0

隨時根據需要修改代碼。 –